Djangogirls - 설치 및 프로젝트 실행하기

Django

python을 기반으로 만들어진 웹 프레임워크

웹 프레임워크(Web Framework)는 다양한 웹 프로그램들을 손쉽게 만드는 기반인 플랫폼의 개념으로, 이를 활용하면 CMS(Content Management System)와 같은 복잡한 웹 프로그램을 비교적 적은 노력을 들여서 만들 수 있습니다.

Django 디렉토리 구성

장고에서는 디렉토리와 파일명이 매우 중요하다.

모든 작업은 가상환경 (vertualenv) 안에서 해야한다.

가상환경 설치

commend_line : django 디렉토리

가상환경 설치

pyenv virtualenv 3.6.2 fc-djgirls

가상환경 local 지정

pyenv local fc-djgirls

git 연동

가상환경 local 디렉토리에서

.git init

git 저장소 생성 (git@github.com:janggunhee/djgirls.git)

vi .gitignore (.gitignore 만들기)

ignore 만들기 :: https://www.gitignore.io/

Django 설치

commend_line :: 프로젝트 디렉토리에서 가상환경 설치

django 설치

pip install django

패키지 이름과 현재 버전을 뜻한다.

pip freeze 

‘현재 버전을 요청’하는 관용적인 표현

pip freeze > requirements.txt
  • 디렉토리 구조 터미널에서 보기 tree .
(fc-djangogirls) ➜  djangogirls_project git:(master) 

djanggirls_project 안에서 djangogirls 폴더를 생성해 블로그를 만들어 보려고 한다.

django project 시작

django-admin startproject config

pycharm 에디터 설정

root 폴더 설정하기

Backend Console

Django에서는 백엔드 콘솔로 제공되는 'manage.py'를 사용해서 모든 백엔드 관리를 수행할 수 있습니다.

예를 들어, 완성한 프로젝트를 운용 서버에 옮긴 뒤 다음 명령을 실행하면 설치된 모든 모듈(App)에 정의된 Model들을 검사해서 필요한 DB Table들을 자동으로 생성해 줍니다.

프로젝트 폴더 내에서

./manage.py migrate

django에서 쓰는 테이블 만큼 데이터를 만든다.

db.sqilite3에 데이터로 저장한다.

웹서버 시작하기

  • command 창에서 실행 웹서버 활성화
(myvenv) ~/djangogirls$ python manage.py runserver
  • 브라우저에서 웹사이트 실행

    http://127.0.0.1:8000/

  • 웹서버 중지

    CTRL + C

객체 (Object)

객체 지향 프로그래밍

  • 모델을 만들어 그 모델이 어떤 역할을 가지고 어떻게 행동해야 하는지 정의하여 서로 상호 작용할 수 있도록 만드는 것이다.

기본적으로 객체지향설계 개념은 현실에 존재하는 것을 속성과 행위로 나타내는 것입니다.

  • 여기서 속성은 객체속성 (propertis) , 행위는 메서드(methods) 로 구현된다.

ORM(Object-Relational Mapping) 추상화 계층

단순히 정적인 내용을 보여주는 웹 프로그램이 아니라면, 시시각각 변하는 Contents를 저장하고 관리하는 데 DB를 필수적으로 사용해야 합니다.

Django에는 DB Adaptor와 유저 프로그램 사이에서 변환작업을 자동으로 수행해주는 ORM(Object-Relational Mapping)계층이 존재합니다. Model을 설계할 때 파이썬에서 사용하는 자료형들을 그대로 사용할 수 있으며, Table에 정확히 어떤 Type의 Field로 저장되는지 신경쓸 필요가 없습니다.

기본적으로 제공하지 않는 자료형은 사용자가 직접 Wrapper함수를 정의하여 기존 ORM과 연동되도록 만들 수도 있습니다.

관계형 데이터베이스 (Database, Relational Database)

키(key)와 값(value)들의 간단한 관계를 테이블화 시킨 매우 간단한 원칙의 전산정보 데이터베이스이다.

« 가능하게 해주는 프로그램 »

  • 오라클 DBMS(Oracle)
  • 마이크로소프트의 MS SQL Server
  • 마이크로소프트의 MS Access MySQL
  • 로터스 소프트웨어의 어프로치(Approach) PostgreSQL
  • IBM사의 IBM DB2와 IBM SQL/DS
  • 볼랜드의 dBASE IV와 파라독스(Paradox)
  • Sybase
  • Informix
  • VMS/Rdb

blog model

class Post(models.Model):는 모델을 정의하는 코드입니다. (모델은 객체(object)라고 했죠?)

class는 특별한 키워드로, 객체를 정의한다는 것을 알려줍니다. Post는 모델의 이름입니다. (특수문자와 공백 제외한다면) 다른 이름을 붙일 수도 있습니다. 항상 클래스 이름의 첫 글자는 대문자로 써야 합니다. models은 Post가 장고 모델임을 의미합니다. 이 코드 때문에 장고는 Post가 데이터베이스에 저장되어야 한다고 알게 됩니다.

어플리케이션 만들기

comman-line

(myvenv) ~/djangogirls$ python manage.py startapp blog

애플리케이션 생성 후 장고에게 사용한다고 알려줘야 한다.

setting.py 파일 안에서 INSTALLED_APPS 를 열어 'blog' 를 추가한다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    'blog',
]

블로그 글 모델 만들기

Model 이라는 객체는 models.py 에서 선언하여 모델을 만든다.

blog/models.py

from django.conf import settings
from django.db import models
from django.utils import timezone


class Post(models.Model):
    # settings.Auth_USER_MODEL > auth.User
    author = models.ForeignKey(settings.AUTH_USER_MODEL)
    title = models.CharField(max_length=100)
    content = models.TextField(blank=True)
    created_date = models.DateTimeField(auto_now_add=True)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title
  • models.CharField - 글자 수가 제한된 텍스트를 정의할 때 사용합니다. 글 제목같이 짧은 문자열 정보를 저장할 때 사용합니다.
  • models.TextField - 글자 수에 제한이 없는 긴 텍스트를 위한 속성입니다.
  • models.DateTimeField - 날짜와 시간을 의미합니다.
  • models.ForeignKey - 다른 모델에 대한 링크를 의미합니다.

데이터베이스에 테이블 만들기

데이터베이스에 우리의 새 모델, Post 모델을 추가할 거에요. 먼저 우리는 장고 모델에 몇 가지 변화가 생겼다는 걸 알게 해줘야 한다.

command-line

./manage.py makemigrations blog
  • Post 모델을 만든다.
./manage.py migrate blog
  • 데이터 베이스에 생성된 Post 모델을을 추가 반영한다.
(myvenv) ~/djangogirls$ ./manage.py migrate blog
Operations to perform:
  Apply all migrations: blog
Running migrations:
  Rendering model states... DONE
  Applying blog.0001_initial... OK
  • 블로그 게시물 모델이 데이터베이스에 저장되었다.

Django 관리자

admin.py

from django.contrib import admin
from .models import Post

admin.site.register(Post)

admin.py django에서 관리하는 관리자 페이지

앞 장에서 정의했던 Post모델을 가져오고(import) 있어요. 관리자 페이지에서 만든 모델을 보려면 admin.site.register(Post)로 모델을 등록해야 한다.

웹 서버를 실행하려면 콘솔 창에서 python manage.py runserver를 실행하는걸 잊지 말아야 한다. 브라우저를 열고 주소창에 http://127.0.0.1:8000/admin/ 을 입력하면 아래와 같은 로그인 페이지를 볼 수 있다.

슈퍼 사용자로 로그인 하기

로그인하기 위해서는, 모든 권한을 가지는 슈퍼 사용자(superuser)를 생성해야 한다. 커맨드라인으로 돌아가서 python manage.py createsuperuser을 입력하고 엔터를 누르세요.

새 터미널 창을 열고 virtualenv를 활성화 시켜 웹 서버를 실행시키고 난 후 명령어를 입력해야한다.

(myvenv) ~/djangogirls$ python manage.py createsuperuser
Username: admin # 블러그 관리자 username 
Email address: admin@admin.com # 블러그 관리자 email 
Password:
Password (again):
Superuser created successfully.
  • password는 8자 이상

post 글을 추가해 본다.

장고 URL 작동방법

mysite/urls.py 에디터에서 파일을 연다.

"""mysite URL Configuration

[...]
"""
from django.conf.urls import url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]
`url(r'^admin/', admin.site.urls)`
  • 장고는 admin/로 시작하는 모든 URL을 view와 대조해 찾는다.
  • 무수히 많은 URL이 admin URL에 포함될 수 있어 정규표현식을 사용한다.

정규 표현식 (regular expression)

URL패턴 만드는 방법

^ : 문자열이 시작할 떄
$ : 문자열이 끝날 때
\d : 숫자
: 바로 앞에 나오는 항목이 계속 나올 때
() : 패턴의 부분을 저장할 때

url 패턴 예시

urlpatterns = [
    url(r'^admin/', admin.site.urls), 
    # admin으로 시작하고/ 일치하면 실행을 한다.
    
    url(r'^$', views.post_list, name='post_list'), 
    # urlresolve

    url(r'^post/(?P<pk>\d+)/', post_detail, name='post_detail'),  
    # post/<숫자1개이상>/ 이 가능하도록 정규표현식 작성
    # 해당 숫자는 그룹으로 감싸고 'pk'라는 그룹명을 지정
    # post/3/ -> post_detail(pk=3)
    
    url(r'^post/add/', post_add, name='add'),
]

http://www.mysite.com/post/12345/라는 사이트가 있다고 합시다. 여기에서 12345는 글 번호를 의미합니다.

뷰마다 모든 글 번호을 일일이 매기는 것은 정말 힘들죠. 정규표현식으로 url패턴을 만들어 숫자값과 매칭되게 할 수 있어요. 이렇게 말이죠. ^post/(\d+)/$. 어떤 뜻인지 하나씩 살펴봅시다.

^post/ : url이(오른쪽부터) post/로 시작합니다.
(\d+) : 숫자(한 개 이상)가 있습니다. 
        이 숫자로 조회하고 싶은 게시글을 찾을 수 있어요.
/ : /뒤에 문자가 있습니다.
$ : url 마지막이 /로 끝납니다.

패턴 예시

url(r'^$', views.post_list, name='post_list'), 
    # urlresolve
  • post_list라는 이름의 view가 ^$ URL에 할당되었습니다.
  • 이 정규표현식은 ^에서 시작해 $로 끝나는 지를 매칭할 것입니다.
  • 즉 문자열이 아무것도 없는 경우만 매칭하겠죠. 틀린 것이 아니에요. 왜냐하면 장고 URL 확인자(resolver)는 ‘http://127.0.0.1:8000/’ 는 URL의 일부가 아니기 때문입니다.
  • 이 패턴은 장고에게 누군가 웹사이트에 ‘http://127.0.0.1:8000/’ 주소로 들어왔을 때 views.post_list를 보여주라고 말할 거에요.

마지막 부분인 name=’post_list’는 URL에 이름을 붙인 것으로 뷰를 식별합니다. 뷰의 이름과 같을 수도 완전히 다를 수도 있습니다.

[Django Docs URL 패턴 링크] https://docs.djangoproject.com/en/1.11/topics/http/urls/

MVC pattern

Model-View-Controller pattern Model:Data View: 사용자에게 제공되는 화면(또는 기능) -> Template (HTML) Controller:Model과 View 사이에서 데이터를 가공하는 역할 <- urlresolver에 연결 -> View (Python function)

1. 사용자의 요청이 server에 도착
2. server는 해당 요청 URL을 Django에 전달
3. Django는 전달받은 URL을 urlresolver로 분석해서 작업을 처리할 Controller에 연결 
4. Controller는 요청을 받아 사용자에게 지공할 View를 응답으로 리턴
5. server는 리턴받은 응답을 사용자에게 전달