2. Getting started


2.1 Django at a glance

2.1.1___Design your model
2.1.2___Install it
2.1.3___Enjoy the free API
2.1.4___A dynamic admin interface : it's not just scaffolding - it's the whole house
2.1.5___Design your URLs
2.1.6___Write your views
2.1.7___Design your templates
2.1.8___This is just the surface



2.1 둘러보기

장고에 대해 간략하게 둘러봅니다.

2.1.1___Design your model : 모델 만들기

장고는 데이터베이스 없이도 사용할 수 있습니다. 하지만 장고가 Object-Relational-Mapper 라는 방식을 기반으로 하기 때문에, 우리는 파이썬 코드로 데이터 베이스에 대한 기록을 남겨야 합니다.

데이터베이스에 대해 기록하는 방법은 정말 많지만, 단순한 예시 하나만 보고 넘어가겠습니다.

# 이 코드는 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

참고) 장고는 MTV 방식으로 구성되고, 그 중 Model은 데이테베이스의 구조를 설정하는 역할입니다.


2.1.2___Install it : 모델 설치하기

위에서 설정한 데이터베이스를 설치해야 합니다. 커맨드라인(cmd, 터미널, 명령 프롬프트 등등...)에 아래 명령어를 입력합니다.

$ python manage.py migrate

migrate명령어는 우리가 새로 설정한 모든 모델(데이터베이스)을 찾아내 데이터베이스에 추가합니다. 추가하는 방식을 좀 더 세밀하게 조정할 수 있지만 다음에 더 알아보도록 하겠습니다.


2.1.3___Enjoy the free API : 무료 API를 즐기세요

수많은 파이썬 무료 API를 즐겨보세요!

# Import the models we created from our "news" app : "news"앱에 만든 모델들을 불러옵니다. 
>>> from news.models import Reporter, Article

# No reporters are in the system yet.: 아직 시스템에 리포터가 등록되어 있지 않습니다.
>>> Reporter.objects.all()
<QuerySet []>

# Create a new Reporter.: 새로운 리포터를 등록해봅시다.
>>> r = Reporter(full_name='John Smith')

# Save the object into the database. You have to call save() explicitly.: 오브젝트를 데이터베이스에 저장합니다. 
>>> r.save()

# Now it has an ID.: 저장 후, 오브젝트는 ID를 가지게 됩니다.
>>> r.id
1

# Now the new reporter is in the database.: 이제 새로운 리포터가 데이터 베이스에 등록되었습니다.
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>

# Fields are represented as attributes on the Python object.: 필드는 파이썬 객체의 속성처럼 표현됩니다.
>>> r.full_name
'John Smith'

# Django provides a rich database lookup API.: 장고는 데이터베이스를 검색하는 다양한 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.

# Create an article.: 기사를 만들어 봅시다.
>>> from datetime import date
>>> a = Article(pub_date=date.today(), headline='Django is cool',
...     content='Yeah.', reporter=r)
>>> a.save()

# Now the article is in the database.: 기사가 데이터베이스에 저장되었습니다.
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>

# Article objects get API access to related Reporter objects.: 기사 객체는 자신에게 맞는 리포터 객체에 접근할 수 있는 API를 가집니다.
>>> r = a.reporter
>>> r.full_name
'John Smith'

# And vice versa: Reporter objects get API access to Article objects.: 리포터 객체 역시 기사객체에 접근할 수 있는 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.
# This finds all articles by a reporter whose name starts with "John".
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: Django is cool>]>

# Change an object by altering its attributes and calling save().
>>> r.full_name = 'Billy Goat'
>>> r.save()

# Delete an object with delete().
>>> r.delete()


2.1.4___A dynamic admin interface : it's not just scaffolding - it's the whole house : 장고의 관리자 모드는 완전합니다. 대강 만든 얼개따위가 아닙니다.

우리가 모델을 정의하고 나면, 장고는 자동으로 훌룡한 '관리자 모드'를 만듭니다. 이 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)

우리는 우리의 웹 사이트 수정권한을 관리자 모드를 통해 설정할 수 있습니다. 사이트의 내용을 관리하기도 편리합니다.

장고로 웹을 개발하는 방법 중 널리 쓰이는 것 하나는 관리자 모드를 이용하는 것입니다. 모델을 만들고 관리자 사이트를 열어서 최대한 빨리 운영을 시작하면, 우리의 스태프나 고객들이 그 안에 데이터를 채우기 시작할 수 있습니다. 그리고 그 후에 데이터가 사람들에게 보여지는 모습을 다듬으면 됩니다.

# 이 내용은 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),
]

위의 코드는 URL과 views를 regular expressions(정규표현식)을 이용해 연결하는 내용입니다. 사용자가 어떤 페이지를 요청하면, 장고는 위 코드에 기록된 모든 패턴을 읽고 일치하는 것을 찾아냅니다. (일치하는 것이 없으면 404 오류 메시지가 나타나고, 이 메시지 역시 따로 설정할 수 있습니다.) 이 과정은 정말 빠르게 실행됩니다.

일치하는 정규표현식을 발견하면 (regexes = regular expressions) 장고는 그것을 끌어와 사용자에게 보여줍니다. 여기에는 간단한 파이썬 함수가 사용됩니다. 각각의 뷰는 요청이 들어온 곳으로 보내지고, 그 값은 정규표현식 안에 캡쳐됩니다.

예를 들어 사용자가 /articles/2005/05/39323/ 라는 URL을 요청한다면 장고는 news.views.article_detail(request, '2005', '05', '39323')이라는 함수를 불러냅니다.

'안 읽어도 되는 시시콜콜한 이야기'

  1. 설명서 중간에 제시된 모든 소스코드들은 서로 연결되어 있습니다. 하나하나 따로 떨어져 있지 않아요. 앞에 나온 소스코드는 뒤에 나온 소스코드에 영향을 줍니다. 우리는 지금 하나하나의 소스코드를 보는 것이 아니라, 하나로 연결된 '프로젝트'에 대한 튜토리얼을 읽고 있습니다.

  2. 저는 처음에 바로 윗 문단 같은 경우 어디서 'news'가 튀어나왔는지 이해할 수 없었습니다. 곰곰이 살펴보니, 소스 코드 위쪽에 경로가 적혀 있네요. mysite/news/models.py라고... 그러니까, 지금 이 소스코드들은 mysite라는 프로젝트의 news 앱 디렉토리에 작성되고 있는 녀석들인 거죠.

기타.
이래서 처음 보는 사람은 튜토리얼 부터 따라하라고 Docs 초반에 적혀있던 걸까요. 프로그래밍을 처음 시작할 때는 '경로'가 뭔지, 어떻게 적는지도 잘 몰랐거든요 : (

파이썬 클래스가 어떻게 호출되는지 덧붙이면 좀 더 이해하기 쉬울 것 같습니다만... (정규표현식이란 단어 설명도) 모든 기초 개념을 설명하면서 진행하는 건 말도 안되지만, 어느 정도가 적정선인지는 좀 더 생각해 봐야 겠습니다. 원본 글에는 단어마다 링크가 걸려 있는데, 링크도 다 영어자료라서 여기선 링크를 거는 의미가 없어요...

분명 설명서 안에 필요한 정보들이 다 나와 있는데, 알아보지 못하고 지나치는, 그래서 이해하기 힘들었던 경우가 한 두 번이 아니었던 것 같습니다. 원래 튜토리얼은 '직접 따라해보는'게 중요한데 영어를 해석하느라 흐름이 뚝뚝 끊겨서 그런 것 같기도 하고...


2.1.5___Write your views : 뷰를 만듭니다.

각각의 뷰는 다음 두 가지 중 하나를 실행하게 됩니다. 첫째, 요청받은 페이지의 내용에 대한HttpResponse 오브젝트를 사용자에게 돌려준다(return). 둘째, Http404와 같은 예외상황이라고 알려준다. 나머지는 우리가 설정하기 나름입니다.

보통, 뷰가 데이터를 찾아내는 건 파라미터(parameters = 매개변수)에 달려 있습니다. 파라미터는 템플릿을 불러와 찾아낸 데이터를 렌더링합니다. 아래의 소스코드는 위에 나왔던 year_archive를 위한 뷰 입니다.

# 이 내용은 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)

위의 소스코드는 장고의 템플릿 시스템을 이용합니다. 이 시스템은 몇몇 강한 특징이 있지만, 프로그래머가 아닌 사람도 사용할 수 있도록 단순함을 유지하기 위해 노력하고 있습니다.


2.1.6___Design your templates : 템플릿 만들기

위에서 나온 소스코드는 news/year_archive.html 이라는 템플릿을 불러옵니다.

장고가 템플릿을 찾는 경로는 템플릿 사이의 중복을 최대한 배제합니다. 장고의 settings.py라는 파일에, 우리는 템플릿을 검색할 디렉토리 목록을 지정해 둘 수 있습니다. 이 때 DIRS ( = directory)를 사용합니다. 만약 필요한 템플릿이 첫 디렉토리에 없으면 장고는 계속해서 다음 디렉토리들을 뒤집니다.

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 %}

중괄호 { } 두 개로 둘러싸인 변수들은 그 변수에 해당하는 모든 값을 불러옵니다.{{ article.headline }} 은 "article 에서 headline 속성을 가진 모든 값을 불러오세요" 라는 뜻입니다. (우리는 위쪽에서 models.py에 article이라는 클래스를 만들어 두었습니다.)

점 (dot).은 속성(attribute)을 불러오는 데만 쓰이지 않습니다. 점을 이용해서 딕셔너리의 키를 찾거나, 인덱스 또는 함수도 찾을 수 있습니다.

{{ article.pub_date|date:"F j, Y" }} 에 '파이프'라고 불리는 | 가 사용된 것에 주의합니다. |는 템플릿 필터라고 불리며, 변수의 값을 걸러냅니다. {{ article.pub_date|date:"F j, Y" }} 의 경우, 파이썬의 datetime object에서 원하는 모양을 걸러내는데 사용되었습니다.

우리는 우리가 원하는 만큼의 필터를 연결할 수 있습니다. 맞춤화된 템플릿 필터나 템플릿 태그를 사용할 수도 있습니다. 이 필터나 태그들은 보이지 않는 곳에서 맞춤화된 파이썬 코드가 움직이게 만듭니다.

마지막으로, 장고에는 '템플릿 상속'이라는 개념이 있습니다. { % extends "base.html" % } 이 바로 템플릿 상속의 예 입니다. { % extends "base.html" % } 는 "첫째, 'base'라고 불리는 템플릿을 불러온다. 이 템플릿은 지정된 블럭들을 가지고 있어야 한다. 그리고 이 템플릿이 가지고 있던 블럭을 뒤따르는 블럭으로 채운다." 간단히 말해서, 이 템플릿 상속이란 개념은 우리가 템플릿을 반복해서 작성하는 일을 엄청나게 줄여줍니다. 각각의 템플릿은 다른 템플릿에 있는 내용은 상속받아서 해결하고, 오직 자기 자신만 가진 유일한 속성만 기록하면 됩니다.

아래는 "base.html" 템플릿입니다. static 파일과 연결되어 있습니다.

# 이 내용은 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>

아주 극단적으로 정리하자면, 위의 소스코드는 사이트의 모양과 느낌(look-and-feel)을 정의하고(사이트의 로고와 함께) 자식템플릿(상속을 받는 템플릿)이 채울 '구멍'을 제공합니다. 이 방식은 사이트 수정을 무척 쉽게 만들어줍니다.

템플릿 상속이 있기 때문에, 우리는 다양한 베이스 템플릿을 이용해 다양한 버전의 사이트를 만들 수 있습니다. 자식 템플릿을 그대로 유지하면서도 말입니다. 장고 개발자들은 이 점을 이용해 사이트의 모바일 버전을 만들 수도 있습니다. 자식 템플릿들은 그대로 둔 채, 오로지 베이스 템플릿만 새로 만들면 됩니다.

만약 다른 시스템을 선호한다면, 굳이 장고의 템플릿 시스템을 이용할 필요는 없습니다. 장고 템플릿 시스템이 장고의 모델과 잘 어우러지긴 하지만, 강제성은 없습니다. 마찬가지로, 장고의 데이터베이스 API를 반드시 사용할 필요도 없습니다. 다른 추상적 데이터베이스를 사용해도 됩니다. 장고를 구성하는 models, views, templates 에 대해서는 앞으로 더 자세하게 알아볼 예정입니다.


2.1.7___This is just the surface : 여기까지, 장고의 겉껍데기를 훑어보았습니다.

여기까지 장고의 기능에 대해 빠르게 훑어보았습니다. 더 유용한 특성들도 존재합니다.

  • Caching framework : 다른 백엔드나 memcahed와 통합
  • Syndication framework : 조그만 파이썬 클래스를 만들드시 쉽게 RSS나 Atom feed를 만듭니다.
  • 자동으로 생성되는 관리자 특성들

results matching ""

    No results matching ""