본문으로 바로가기

Django tutorial 끝내기 with mysql - 2

category Project/gist 2019. 6. 26. 13:00

Django로 API 서버를 구축하기 위한 목적으로 Django Tutorial을 진행하고 있다.

본래 목적과 관련 없는 부분일 수도 있으나 Tutorial은 끝까지 진행할 예정이다.


View

poll 앱에서는 4개의 view가 필요하다. view는 요청된 URL을 분석하여 적절한 view를 선택한다. 각 view는 파이썬의 함수나 클래스 기반의 view의 경우에는 클래스의 메서드로 표현된다. 각 뷰는 두 가지 중 하나를 수행한다. 요청된 페이지의 내용을 포함하는 HttpResponse 객체를 반환하거나 Http404와 같은 예외를 발생시킨다.

  • Question 'index' page : 가장 최근의 질문을 보여준다.
  • Question 'detail' page : 결과는 포함되지 않았지만 투표할 수 있는 form과 함께 질문을 보여준다.
  • Question 'results' page : 특정 질문의 결과를 보여준다.
  • Vote action : 특정 질문에 대한 특정 선택을 투표로 처리한다.

View에서는 데이터베이스의 데이터를 읽어올 수도 있으며, Django나 third-party 템플릿 시스템을 사용할 수도 있다. PDF 파일을 만들거나, XML을 출력하거나 원하는 zip 파일을 만들고, 원하는 모든 Python 라이브러리를 사용하여 원하는 모든 것을 만들 수 있다. 다음은 기본적인 index 페이지를 만들기 위한 View의 index부분이며, templates/polls 디렉토리를 생성하고, index.html 파일을 작성해주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# polls/views.py
 
from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader
from .models import Question
 
# Create your views here.
def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    template = loader.get_template('polls/index.html')
    context = {
        'latest_question_list' : latest_question_list
    }
    return HttpResponse(template.render(context, request))
 
cs

views에서 아래의 index.html을 읽어와 HttpResponse에서 render하여 반환하고 있다.

render의 첫번째 인자는 요청한 객체를, 두번째 인자로는 템플릿 엔진으로 넣어야 한다. index.html에서 'latest_question_list'가 어떻게 활용되고 있는지 확인하는 편이 좋다. 사실 사용법 자체는 이전에 사용해보았떤 jinja2와 거의 동일해보여서 이해하는데 큰 어려움은 없다.

1
2
3
4
5
6
7
8
9
10
11
<!-- templates/polls/index.html -->
 
{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}
cs

URL

보통  Django의 프로젝트에는 다수의 앱이 존재한다. 각각의 앱들마다 URL 이름을 구분하기란 어렵다. 유사한 페이지들로 구성된 앱들이 존재하는데 이러한 경우에는 혼돈을 방지하기 위하여 앱의 urls.py에 네임스페이스를 추가하여 구분한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# polls/urls.cpy
 
from django.urls import path
 
from . import views
 
# polls 앱에 대한 namespace 추가
app_name = 'polls'
urlpatterns = [
    # ex: /polls/
    path('', views.index, name='index'),
    # ex: /polls/5/
    path('<int:question_id>/', views.detail, name='detail'),
    # ex : /polls/5/results/
    path('<int:question_id>/results', views.results, name='results'),
    # ex : /polls/5/vite/
    path('<int:question_id>/vote/', views.vote, name="vote"),
]
cs

그러면 html에서 렌더링 할때 다음과 같이 쓸 수 있다. 

1
2
3
4
5
6
7
8
9
10
11
<!-- templates/polls/index.html -->
 
{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}
cs

이 Tutorial은 총 part 7까지 있으며, 이 포스팅으로 나는 part 3 까지 마쳤다. 튜토리얼을 따라가는데는 많은 시간이 소요되지는 않지만 중간중간 개념들을 익히고 완전히 이해한 다음에 넘어가면 시간이 조금 걸리는 것 같다. 그렇다 하더라도 최대 하루면 다 끝낼 수 있는 양이다.