Django 웹 프레임워크

아래 내용은 파이썬 웹프로그래밍(한빛출판사) 책의 내용을 정리한 것입니다.

일반적인 특징

  • MTV 패턴 기반
    • Template: 데이터를 사용자에게 보여주는 컴포넌트 (MVC에서의 View)
    • View: 데이터를 가져와 변형하는 컴포넌트 (MVC에서의 Controller)
  • 객체 관계 매핑
    • ORM 기능 제공
  • 자동으로 구성되는 관리자 화면
    • 데이터베이스 관리를 할 수 있는 관리자 화면을 자동을 만들어준다.
  • 우아한 URL 설계
  • 자체 템플릿 시스템
    • 확장이 가능하고 디자인이 쉬운 템플릿 시스템 제공
    • 화면 디자인과 로직에 대한 코딩을 분리하여 개발 가능
  • 캐시 시스템
    • 캐시용 페이지를 메모리, DB, 파일 시스템에 저장 가능
    • 캐시 단위로는 페이지, 사이트 전체, 특정 뷰의 결과, 템플릿 일부 등으로 지정 가능
  • 다국어 지원
    • 텍스트의 번역, 날짜/시간/숫자 포맷, 타임존의 지정등고 ㅏ같은 다국어 환경 제공
  • 풍부한 개발 환경
    • 테스트 용 웹 서버 포함
    • 디버깅 모드 제공
  • 소스 변경사항 자동 반영
    • *.py 파일의 변경사항을 자동으로 반영

Django 설치

$ pip3 install django
$ python3
>>> import django
>>> print(django.get_version())
1.8.4  

Django 에서의 개발

MTV 패턴

MVC 패턴과 용어만 조금 다르니.. 자세한 설명은 패스~

Model

모델은 사용될 데이터에 대한 정의를 담고 있는 클래스이다.

모델 클래스는 models.py 파일에 정의한다.

from django.db import models

class Person(models.Model):  
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

Person 클래스는 내부적으로 다음과 같은 SQL문으로 테이블을 생성한다.

CREATE TABLE myapp_person {  
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
};

장고에서 테이블 및 컬럼을 자동으로 생성하기 위한 아래와 같은 몇가지 규칙이 존재한다.

  • 테이블명은 애플리케이션과 테이블 클래스명을 '_'로 연결, 모두 소문자로 표시한다.
  • Primary Key는 Person 클래스에서 정의하지 않아도 자동으로 부여한다.

Template

장고는 자체 템플릿 시스템을 가지고 있으며, 이는 쉬운 문법을 제공하여 디자이너와 개발자 간에 효율적인 협업을 가능케한다. 템플릿 파일은 *.html 확장자를 가지며, settings.py 파일에 정의되어 있는 TEMPLATE_DIRSINSTALLED_APPS 에 지정된 위치에서 템플릿 파일을 검색한다.

INSTALLED_APPS = {  
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls'
)

TEMPLATE_DIRS = ['/hom/shkim/pyBook/ch3/templates']  

URLconf - URL 설계

URL 정의를 위해서는 urls.py 파일에 URL과 처리 함수를 매핑하는 파이썬 코드를 작성한다. 이러한 URL/뷰 매핑을 URLconf 라고 한다.

from django.conf.urls immport patterns, url  
from . import views

urlpatterns = patterns('',  
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/(\d{4})/$', views.year_archive),
    url(r'^articles/(\d{4})/(\d{2})/$', views.month_archive),
    url(r'^articles/(\d{4})/(\d{2})/(\d+)/$', views.article_detail),
)

장고에서 URL 을 분석하는 순서는 다음과 같다.

  • setting.py 파일의 ROOT_URLCONF 항목을 읽어 URLconf(urls.py)의 위치를 알아낸다.
  • URLconf 모듈을 로딩하여 urlpatterns 변수에 지정되어 있는 URL 리스트를 검사한다.
  • 순서대로 URL 리스트의 내용을 검사하면서 매치가 되면 검사를 종료한다.
  • 매치가 된 URL 의 뷰를 호출하며, 이때 HttpRequest 객체와 URL 매칭시 추출된 단어들을 뷰에 넘겨준다.
  • 매칭에 실패하면 에러를 처리하는 뷰를 호출한다.

View - 로직 설계

장고에서의 뷰는 함수 또는 클래스의 메소드롤 작성되며, 웹 요청을 받고 응답을 반환한다. 뷰는 보통 views.py 파일에 작성하지만, 다른 파일에 작성해도 무방하다. 다만, 파이썬 경로에 있는 파일이어야 찾을 수가 있다.

from django.http import HttpResponse  
import datetime

def currrent_datetime(request):  
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

에러를 반환하고 싶다면 HttpResponseNotFount 와 같은 에러 응답 객체를 반환하면 된다. 에러 응답 클래스는 모두 HttpResponse 클래스의 하위 클래스로 정의되어 있다.

Django 프로젝트 시작하기

Django 프로젝트 생성

$ cd /home/dev/pyBook
$ django-admin.py startproject mysite

django-admin.py 파일의 위치는 운영체제와 파이썬 버전에 따라 조금씩 다른 것 같다. 내 환경인 OSX10.10.5, python3 의 경우에는 다음과 같았다.

/Library/Frameworks/Python.framework/Versions/3.4/bin

애플리케이션 생성

$ python3 manage.py startapp polls

애플리케이션을 정상적으로 생성하면 아래 그림과 같이 관련 디렉토리가 생긴다.

데이터베이스 변경사항 반영

데이터베이스에 변경사항이 있을때 이를 반영해주는 명령이다.

$ cd /home/dev/pyBook/ch3
$ python3 manage.py migrate

장고는 기본적으로 개발시 반드시 사용자와 사용자의 그룹 테이블이 필요하다고 가정하기에, 별도 테이블을 만들지 않았더라도 사용자 및 사용자 그룹 테이블을 만들어주기 위해 프로젝트 개발 시작 시점에 해당 명령을 실행한다.

그림과 같이 db.sqlite3 파일이 생성된 것을 확인할 수 있다. 그리고 다음과 같은 명령을 실행하면 로컬에서 간단히 서버를 실행할 수 있고, 웹으로 확인 가능하다.

$ python3 manage.py runserver 8000