장고(Django) 개발: 프로젝트 시작과 구성

히즈웨드 |

    작년에 장고(Django) 프레임워크로 프로젝트를 진행하면서 공부했던 개발 지식을 블로그에 다시 정리하려고 합니다. 개인 위키에 정리했던 것을 옮기는 수준이라, 친절한 설명은 기대하기 어렵고, 프로그래밍 언어와 파이썬 지식이 어느정도 있어야 이해할 수 있을 것입니다.


    아래 내용들은 Django 1.6~1.7 버전을 기준으로하고, "쉽고 빠른 웹개발 Django"란 책에서 1/3, 공식 위키에서 1/3, 그리고 나머지는 구글링을 바탕으로 정리한 지식입니다. 말투가 존대와 반말이 섞여있어도 이해바랍니다 :)


    장고(Django) 개발 환경 구축에 대한 포스팅도 참고해주세요.





    1 Django 시작

    2 장고의 MVC 패턴

    3 URL 주소 설정

    4 추가 및 문제 해결




    1 Django 시작

    프로젝트 만들기

    프로젝트 명과 프로젝트 디렉토리명이 동일함.

    자세한 사항은 장고(Django) 개발 환경: 윈도우 개발PC에 설치하기 참고.

    django-admin.py startproject 프로젝트명

    프로젝트 파일 기본 구성

    django_bookmarks/         # django-admin.py startproject 로 생성한 프로젝트
        django_bookmarks/     # 기본 디렉토리
            __init__.py       # 디렉토리를 파이썬 패키지화
            settings.py       # DB, 언어 등 기본 설정
            urls.py           # 정규표현식으로 URL 설정
            wsgi.py
        bookmarks/            # python manage.py startapp 명령으로 생성한 앱
            __init__.py       # 디렉토리를 파이썬 패키지화
            admin.py
            models.py         # 모델 : ORM 컴포넌트
            tests.py
            views.py          # 뷰 : 컨트롤러 컴포넌트
        templates/            # 템플릿 모음
            main_page.html
            user_page.html
        manage.py             # 장고 프로젝트 관리 명령을 가짐
        db.sqlite3            # SQLite DB파일

    프로젝트 기본 설정

    settings.py 에서 DB, 언어, 시간 등의 프로젝트의 기본 설정을 할 수 있다.

    # 이외의 설정은 기본 설정을 따름
    # Database
    DATABASES = {
        'default': {
            'ENGINE''django.db.backends.sqlite3', # Add 'postgresql_psycopg2''mysql''sqlite3' or 'oracle'.
            'NAME''DB이름',                     # Or path to database file if using sqlite3.
            'USER''',                             # Not used with sqlite3.
            'PASSWORD''',                         # Not used with sqlite3.
            'HOST''',                             # Set to empty string for localhost. Not used with sqlite3.
            'PORT''',                             # Set to empty string for default. Not used with sqlite3.
        }
    }
    DATABASE_OPTIONS = {'charset''utf8'}
     
    # Internationalization
    LANGUAGE_CODE = 'ko-kr'
    TIME_ZONE = 'Asia/Seoul'

    앱 만들기

    하나의 프로젝트 아래에 다수의 앱을 만들 수 있는데, 장고에 이미 만들어진 앱을 사용할 수도 있고 사용자가 새로운 앱을 만들 수도 있다.

    사용자가 새로운 앱을 만드는 경우,

    python manage.py startapp 앱이름

    앱 생성 후, settings.py에 등록

    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        '앱이름',
    )




    2 장고의 MVC 패턴

    장고도 다른 웹 프레임워크와 같이 MVC 패턴을 가지지만 용어가 다르기 때문에, 헷갈리지 않도록 주의하자. (장고 MVT = 기존 MVC)

    • 장고의 Model = Model
    • 장고의 View = Controller
    • 장고의 Template = View

    모델 (Model)

    DB 구조를 설정하는 컴포넌트로, ORM 방식을 사용하여 SQL문을 직접 사용하지 않고 파이썬 객체로 접근하기 때문에 실제 DB와 거의 완벽하게 분리된다.

    models 패키지의 Model 객체를 상속받는 클래스가 하나의 DB 테이블을 의미하며, 특정 Field 클래스의 인스턴트로 생성되는 변수들이 해당 테미블의 필드가 된다.

    모델 클레스 선언 예제
    from django.db import models
     
    class Person(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=30)
        필드명 = modles.필드_타입(필드_옵션)
     
        class Meta:
            ordering = ["first_name"]
            메타_옵션
    • 필드 타입과 필드 옵션
    • 메타 옵션
    • 모델 관련 함수
    • 모델 관련 콘솔 명령

    뷰 (View)

    뷰란, 데이터를 입력받거나 표시하는 컴포넌트로, MVC 패턴에서는 Controller에 속함

    def main_page(request):
        shared_bookmarks = SharedBookmark.objects.order_by('-date')[:10]
         
        variables = RequestContext(request, {
            'shared_bookmarks': shared_bookmarks
        })
        return render_to_response('main_page.html', variables)
    • 뷰에서 템플릿을 컨트롤하는 방법
    • 뷰의 함수와 특정 URL을 연결시켜주는 urls.py

    템플릿 (Templates)

    템플릿이란 디자인 영역의 분리 및 재사용성을 높이기 위해, HTML 구조만을 따로 모아놓은 것으로 {{ 변수 }}, {% 태그 %}와 같은 방법으로 뷰에서 제어함

    {% extends "base.html" %}{% block external %}
        <script type="text/javascript" src="/site_media/bookmark_edit.js"></script>
    {% endblock %}
    {% block title %}{{ username }}{% endblock %}
    {% block head %}{{ username }}의 북마크입니다.{% endblock %}
    {% block content %}
        {% include "bookmark_list.html" %}
    {% endblock %}
    • 템플릿 변수와 필터
    • 템플릿 태그
    • 템플릿 주석처리




    3 URL 주소 설정

    뷰의 함수와 특정 URL을 연결시켜주는 역할을 urls.py에서 수행한다.

    주소 패턴으로는 정규 표현식(Regular Expression)을 사용함.

    from django.conf.urls import patterns, include, url
    from django.contrib import admin
    from 뷰의 import 함수
     
    admin.autodiscover()                               # admin 주소 자동으로 찾기
     
    urlpatterns = patterns('',
        url(r'^admin/', include(admin.site.urls)),     # /admin 주소
        url(r'^$', main_page),                         # / 메인 페이지
        url(r'^user/(\w+)/$', user_page),              # /user/user_name 페이지
    )




    4 추가 및 문제 해결

    파이썬 2.x 버전에서 한글 사용시,

    모든 py파일의 최 상단에 아래 utf 관련 문구를 꼭 표기해야 함.

    # -*- coding: utf-8 -*-

    간단한 디버깅을 위한 명령

    sys.stdour, sys.stderr 등을 사용하여 콘솔에 데이터를 찍어볼 수 있음

    import sys
     
    print >>sys.stdout, "내용"

    'Settings' object has no attribute 'SITE_ID' 오류

    settings.py에 'django.contrib.sites' 앱을 선언하면, SITE_ID 변수를 선언해줘야 오류가 나지 않는다.

    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'django.contrib.sites',
        'django.contrib.comments',
    )
     
    # 중략
     
    # Required SITE ID
    SITE_ID = 1