Django 뷰 작성하기

Django 뷰 작성하기

Django에서 요청이 들어오면 "누가 응답할까"를 결정하는 것이 바로 뷰(view)예요. 뷰 함수는 웹 요청을 받아 웹 응답을 돌려주는 파이썬 함수예요. 응답은 웹 페이지의 HTML일 수도, 리다이렉트나 404일 수도, XML 문서나 이미지일 수도 있어요. 중요한 건 요청을 받아 응답을 돌려주는 그 역할이에요.

출처: Writing views | Django documentation

뷰는 필요한 로직을 자유롭게 담을 수 있고, 파이썬 경로 위에만 있으면 어디에 둬도 상관없어요. 특별한 "마법"은 없어요. 관례적으로 프로젝트나 앱 디렉터리의 views.py 파일에 뷰를 둬요.

간단한 뷰

현재 날짜와 시간을 HTML 문서로 돌려주는 뷰를 만들어 볼게요.

from django.http import HttpResponse
import datetime

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

코드를 한 줄씩 살펴볼게요. 먼저 django.http 모듈에서 HttpResponse 클래스를, 파이썬의 datetime 라이브러리를 import 해요. 그다음 current_datetime 함수를 정의하는데, 이게 뷰 함수예요. 각 뷰 함수는 첫 번째 인자로 HttpRequest 객체를 받아요. 관례적으로 이름은 request로 지어요.

뷰 함수의 이름은 중요하지 않아요. Django가 인식하기 위해 특정 이름을 요구하지 않아요. 여기서는 하는 일이 잘 드러나도록 current_datetime이라고 지었을 뿐이에요. 결국 뷰는 생성한 응답을 담은 HttpResponse 객체를 돌려줘요. 예외 경우가 있긴 하지만, 각 뷰 함수는 HttpResponse 객체를 반환하는 책임이 있어요.

URL과 뷰 연결하기

이 뷰가 특정 URL에 표시되게 하려면 URLconf를 만들어야 해요. URL 경로를 뷰에 매핑하는 방법은 URL dispatcher 문서에서 다뤄요.

에러 응답 반환하기

Django는 HTTP 에러 코드를 반환하는 것을 도와줘요. 200("OK"를 뜻함) 외의 흔한 HTTP 상태 코드를 위한 HttpResponse의 하위 클래스가 여럿 있어요. 에러를 나타내려면 일반 HttpResponse 대신 그 하위 클래스 인스턴스를 반환하면 돼요.

from django.http import HttpResponse, HttpResponseNotFound

def my_view(request):
    # ...
    if foo:
        return HttpResponseNotFound("<h1>Page not found</h1>")
    else:
        return HttpResponse("<h1>Page was found</h1>")

모든 응답 코드에 전용 하위 클래스가 있는 건 아니에요. 흔하지 않은 코드가 많기 때문이에요. HttpResponse에 상태 코드를 직접 지정하는 방식도 이어서 설명돼요.

정리하면, 뷰는 "요청을 받아 응답을 돌려주는 함수"가 전부예요. HttpResponse를 반환해 페이지를 보여주거나, 에러 하위 클래스로 오류를 표현하면 돼요. URLconf에서 URL과 뷰를 이어 주는 것만 기억하면 돼요.

더 알아보기