본문 바로가기

참고문서(번역?)/파이썬

Django로 DB 건들이기가 쉬운겨? ^^

출처: Django 공식싸이트의 어떤 문서(https://docs.djangoproject.com/en/1.10/intro/overview/)

한번 시작해 볼까요? 저작권에 문제가있다면 바로 삭제하겠습니다.

번역은 기냥 제가 편한데로... 어떨 땐 의역, 어떨 땐 직역 ^^

불편하더라도 양해 바랍니다.


한눈에 보는 Django

Django는 아주 빠른 속도로 뉴스룸 같은 환경(여러 개의 기사 후보 중에서 급하게 인쇄될 기사를 선정하고 기사를 작성하는 정신 없이 바쁜?)에서 개발되었기 때문에, 공통의 웹개발 작업을 빠르고 쉽게 하도록 설계되었다. 이 글은 Django를 가지고 데이터베이스 위주의 웹 앱을 작성하는 비공식  개요입니다.

이 문서의 목적은 Django가 어떻게 작동하는지에 대한 충분한 기술적인 스펙을 제공하는 것이지만 튜토리얼이나 레퍼런스를 의도하고 작성된 것은 아니다. - 그러나 둘 다 해낸 듯!  프로젝트를 시작할 준비가 되면, 튜토리얼로 시작하거나 세세한 문서들을 살펴 볼 수도 있다. 

모델 설계

Django를 데이터베이스 없이 사용할 수도 있지만, Django는 Python 코드로 당신의 데이터베이스 레이아웃을 묘사할 수 있는  object-relational mapper 를 제공하므로 데이터베이스를 사용하는 것도 잘 지원하고 있다.

 수 년 동안 데이터베이스-스키마 관련 문제를 해결해왔기 때문에 data-model syntax는 여러분의 모델을 표현할 수 있는 많은 풍부한 방법을 제공한다. 여기 간단한 예제가 있다:

mysite/news/models.py
from django.db import models

class Reporter(models.Model):
    full_name = models.CharField(max_length=70)

    def __str__(self):              # __unicode__ on Python 2
        return self.full_name

class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):              # __unicode__ on Python 2
        return self.headline

모델 설치(?)

다음으로 Django 명령줄 유틸리티를 실행하여 데이터베이스 테이블을 자동으로 생성하라:

$ python manage.py migrate

migrate  명령은 설정에 정의한 가용한 모든 모델들을 살펴 보고 데이터베이스에 테이블을 생성한다. 그 밖에도 매우 풍부한 스키마 컨트롤 기능을 제공한다.

무료 API

데이터에 접근할 수 있는 무료 Python API 가 풍부하게 있다. API는 필요에 의해 계속 보완 중이며 코드 자동생성은 필수적이지는 않다(?):

# "news" 엡으로부터 생성된 모델들을 Import >>> from news.models import Reporter, Article # 아직 시스템에는 reporters는 없음 >>> Reporter.objects.all() <QuerySet []> # 새로운 Reporter를 생성 >>> r = Reporter(full_name='John Smith') # 객체를 데이터베이스에 저장. 명시적으로 save()를 호출해야 함 >>> r.save() # 이제 id가 생겼네 >>> r.id 1 # 이제 새로 만든 reporter 객체는 데이터베이스에 있네 >>> Reporter.objects.all() <QuerySet [<Reporter: John Smith>]> # 필드는 Python 객체에서는 속성으로 표현된다. >>> r.full_name 'John Smith' # 다음은 Django가 제공하는 풍부한 데이터베이스 관련 API >>> Reporter.objects.get(id=1) <Reporter: John Smith> >>> Reporter.objects.get(full_name__startswith='John') <Reporter: John Smith> >>> Reporter.objects.get(full_name__contains='mith') <Reporter: John Smith> >>> Reporter.objects.get(id=2) Traceback (most recent call last): ... DoesNotExist: Reporter matching query does not exist. # article 생성 >>> from datetime import date >>> a = Article(pub_date=date.today(), headline='Django is cool', ... content='Yeah.', reporter=r) >>> a.save() # 이제 article도 데이터베이스에 >>> Article.objects.all() <QuerySet [<Article: Django is cool>]> # Article 객체가 연관된 Report 객체에 접근하는 API를 갖음 >>> r = a.reporter >>> r.full_name 'John Smith' # 그와 반대로: Reporter 객체도 Article 객체에 접근하는 API를 갖게 됨 >>> r.article_set.all() <QuerySet [<Article: Django is cool>]> # The API follows relationships as far as you need, performing

# efficient JOINs for you behind the scenes. # 아래는 "John"으로 시작하는 모든 reporter가 쓴 article을 찾아 준다. >>> Article.objects.filter(reporter__full_name__startswith='John') <QuerySet [<Article: Django is cool>]> # 속성을 바꾸고 save()를 호출하여 객체를 변화시킴 >>> r.full_name = 'Billy Goat' >>> r.save() # delete()를 이용하여 객체를 삭제 >>> r.delete()

동적인 admin 인터페이스: 발판 한 개 놓은 정도라고 생각하면 오산이다. 꽤 괜찮다. ㅎ 집 한 채라고 생각하시길...

모델이 정의되고 나면 Django는 전문적이고, 운영환경에도 사용가능한 administrative interface 를 자동으로 생성한다. 인증된 사용자를 추가하고 객체를 변경 및 삭제할 수 있는 웹싸이트를 기본으로 제공한다. 

mysite/news/models.py
from django.db import models

class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
mysite/news/admin.py
from django.contrib import admin

from . import models

admin.site.register(models.Article)

웹싸이트를 일반 직원 또는 고객이 편집하거나 또는 웹싸이트의 컨텐츠를 관리하기 위해서 백엔드 인터페이스를 수정해야 하는 상황을 원치 않는 사람들을 위해 만들고자 하였다. 

Django 앱을  만드는 전형적인 작업흐름은 

  1.  우선 모델을 만들고

  2. admin 싸이트를 가능한 빨리 가동시키는 것이다. 그러면 

  3. 당신의 직원(또는 고객)은 데이터를 채워넣기 시작할 것이고, 이후에는 

  4. 데이터를 대중에게 보여주는 방법을 개발하면 된다.

URL 설계

고품질 웹 애플리케이션은 URL scheme이 깔끔하고 우아해야 한다..  Django는 아름다운 URL 설계를 장려하며   .php 또는 .asp 같은 불쾌한 것(?, cruft)을 URL에 넣지 않는다. 

앱을 위한 URL을 설계하기 위해서 URLConf라고 불리는 Python 모듈을 생성한다. 앱의 컨텐츠를 매핑하는 테이블인데, 내용은 Python callback 함수와 URL 패턴들간의 간단한 매핑으로 되어 있다.  URLconf는 또한 Python  코드와 URL의 매핑을 해제하는데에도 사용할 수 있다.

다음은 위에 있던 Reporter/Article 예제를 위한 URLconf 임

mysite/news/urls.py
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

위의 코드는 regular expressions의 형태인 URL과 Python callback 함수들(views)을 매핑한다. 정규표현식은 URL에서 값들을 캡쳐하기 위해 괄호를 사용한다. 사용자가 특정 페이지를 요청할 때, Django는 각각의 패턴을 순서대로 실행하다가 요청된 URL과 매치되는 첫번째 것에서 멈춘다. (만일 일치하는 것이 없으면, DJango는 특수한 케이스인 404 view를 호출한다. 이 과정은 앱이 로드될 때 정규표현식이 컴파일 되므로 불길이 타오르듯 매우 빠르다. 

일단 한개의 regex가 일치하면, DJango는 매핑된 view를 아주 간단한 Python 함수를 이용하여 import하고 호출한다. 각 각의 view는 request 객체 - 요청 메타데이터가 포함된 - 와 reqex로 캡쳐된 값을 넘겨 받는다. 

예를 들어, 사용자가 “/articles/2005/05/39323/”과 같은 URL을 요청하면 DJango는 다음의 함수를 호출한다.

 news.views.article_detail(request, '2005', '05', '39323').

View 작성

각각의 view는 다음 두가지 중의 하나를 책임진다. 요청된 페이지의 내용을 담고 있는 HttpResponse객체를 반환하거나 Http404와 같은 예외를 발생시킨다. 나머지는 당신에게 달려 있다. 

일반적으로 view는 매개변수에 따라 데이터를 검색하고 템플릿을 로드하고 템플릿에 검새된 데이터를 렌더링한다.  다음은 위의 year_archive 에 대한 예제 view임. 

mysite/news/views.py
from django.shortcuts import render

from .models import Article

def year_archive(request, year):
    a_list = Article.objects.filter(pub_date__year=year)
    context = {'year': year, 'article_list': a_list}
    return render(request, 'news/year_archive.html', context)

This example uses Django’s template system, 이 예제는  DJango의 템플릿 체계를 이용하고 있는데, 여러개의 막강한 특징들을 갖추고 있으나 개발자 아닌 사람들의 사용을 위해 충분히 단순화하려고 노력하고 있다. 

template 설계

위의 코드는 news/year_archive.html 템플릿을 로드한다.

Django는 템플릿을 찾을 경로를 가지고 있는데, 이렇게 함으로써 템플릿을 찾는 수고를 줄인다. Django 셋팅에 보면,  DIRS 키워드를 이용하여 템플릿을 확인할 디렉토리들이 지정되어 있다.  첫 번째 디렉토리에 템플릿이 없으면 두 번째, 그리고 계속 찾아나간다.

news/year_archive.html을 찾았다고 치고, 아래와 같은 모양일 것이다:

mysite/news/templates/news/year_archive.html
{% extends "base.html" %}

{% block title %}Articles for {{ year }}{% endblock %}

{% block content %}
<h1>Articles for {{ year }}</h1>

{% for article in article_list %}
    <p>{{ article.headline }}</p>
    <p>By {{ article.reporter.full_name }}</p>
    <p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}

Variables 변수들은 이중 괄호({{ 와 }})에 둘어싸여 있다. {{ article.headline }} 의 의미는  “기사의헤드라인 속성을 출력하라” 이다. 그러나 점(dot)은 속성을 찾는데에만 쓰이는 것은 아니다. 사전-키를 찾을 때나 인덱스 찾을 때 그리고 함수 호출을 위해서도 사용된다.

{{ article.pub_date|date:"F j, Y" }} 는 unix 스타일의 파이프(|)를 사용하는 것에 주의하라. 이 것은 템플릿 필터라고 하는데, 변수의 값을 필터(?)하는 것이다. 이번 경우는 날짜 필터가 Python 데이터타임 객체를 주어진 포맷(PHP의 data 함수처럼)으로 변경하는 것이다.

사용하고 싶은 만큼 많은 필터를 엮을 수 있다. 커스텀 템플릿 필터 를 만들 수도 있다. 커스텀 템플릿 태그도 만들 수 있는데, 뒤에서 커스텀 Python 코드를 실행시킬 수 있다.

마지막으로, Django는 "템플릿 상속(template inheritance)" 개념을 사용한다. {% extends "base.html" %} 이 그러한 경우로, 이 문장의 의미는 "우선 'base'라는 템플릿(상당히 많은 block을 가지고 있겠지 ^^)을 로드하고 다음에 아래에 나열된 코드로 block을 채워라"이다. 간단하게 말하면, 이 기능을 이용하면 템플릿의 redundancy를 극적으로 줄일 수 있다. 각각의 템플릿은 그 템플릿에 고유한 것들만 정의하면 되기 때문이다. 

아래는 “base.html” 템플릿이다.  정적 파일의 사용을 포함하고 있다.:

mysite/templates/base.html
{% load static %}
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <img src="{% static "images/sitelogo.png" %}" alt="Logo" />
    {% block content %}{% endblock %}
</body>
</html>

극단적으로 단순하게 표현하면, 템플릿은 싸이트 로고를 포함하여 싸이트의 룩앤필을 정의하고 자식 템플릿 들이 채워 넣을 구멍(block?)들을 제공한다. 이렇게 되어 있기 때문에 싸이트 재설계가 하나의 파일 - base template-을 수정하는 것처럼 쉽다.

또한 자식 템플릿은 유지하고 다른 base template을 가지고 다양한 버전의 싸이트를 생성할 수도 있다. Django의 창조자들은 이런 테크닉 - 단순히 base template을 새로 만들기 - 을 활용하여 충격적으로 다른 모바일 버전의 싸이트를 생성해 냈다. 

만일 당신이 다른 시스템을 더 선호한다면 굳이 Django의 템플릿 시스템을 사용하지 않아도 된다. Django의 템플릿 시스템이 특히 Django의 모델 레이어와 잘 통합되기는 하지만 어떤 것도 여러분을 가요할 수는 없다. 같은 이유로, 당신은 굳이 Django의 데이터베이스 API를 사용하지 않아도 된다. 당신은 다른 데이터베이스 추상계층을 사용하고, XML 파일을 읽고, 디스크에서 파일을 읽어 들이고, 그 밖에 어떤 것도 할 수 있다. 그러나 그렇게 하게 되면 그 다음부터는 Django의 각각의 구성 요소 - model, view, template -과는 안녕이다. ^^

이 것은 단지 수박 겉핥기일뿐이다.

여기까지 Django의 기능에 대해 빠르게 개요를 살펴보았다. 몇 몇 더 유용한 특징은 다음과 같다:

  • memcached 또는 다른 백엔드 솔루션과 통합되는 caching framework
  • 작은 Python 클래스 하나 제작하는 것만큼 쉽게 RSS feed나 Atom feed를 제작할 수 있는 syndication framework
  • 더욱 더 섹시한 자동으로 생성된 admin - 이 글에서는 거의 수박 겉핥기 정도만 다루었다. 

이제 다음으로 당신이 할 일은  Django 다운로드 , tutorial 읽기 그리고 community에 참여하기 이다.