view는 파이썬 함수이다.
views.py는 앱 내 또는 프로젝트에 위치한다.
views.py 파일 내 어디든 view 코드를 두면 된다.
응답(response)
을 함으로써 페이지를 띄울 수 있다.
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
URL dispatcher를 통해 view와 특정 url을 연결짓고 관리할 수 있다.
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>")
from django.http import HttpResponse
def my_view(request):
# ...
# Return a "created" (201) response code.
return HttpResponse(status=201)
return HttpResponseNotFound("<h1>Page not found</h1>")
from django.http import Http404
from django.shortcuts import render
from polls.models import Poll
def detail(request, poll_id):
try:
p = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404("Poll does not exist")
return render(request, "polls/detail.html", {"poll": p})
DEBUG가 True이면 메세지가 http404에게 제공되고 standard 404 debug template에 나타난다.
디버그 과정에서 이 메세지를 사용하면 좋다. 그리고 일반적으로 production 환경에서는 사용하지 않는다.
The page_not_found() view is overridden by handler404:
handler404 = "mysite.views.my_custom_page_not_found_view"
The server_error() view is overridden by handler500:
handler500 = "mysite.views.my_custom_error_view"
The permission_denied() view is overridden by handler403:
handler403 = "mysite.views.my_custom_permission_denied_view"
The bad_request() view is overridden by handler400:
handler400 = "mysite.views.my_custom_bad_request_view"
CSRF 에러 view를 override해서 CSRF_FAILURE_VIEW를 사용할 수도 있다!
Cross-Site Request Forgery (CSRF)
from django.core.exceptions import PermissionDenied
from django.http import HttpResponse
from django.test import SimpleTestCase, override_settings
from django.urls import path
def response_error_handler(request, exception=None):
return HttpResponse("Error handler content", status=403)
def permission_denied_view(request):
raise PermissionDenied
urlpatterns = [
path("403/", permission_denied_view),
]
handler403 = response_error_handler
# ROOT_URLCONF must specify the module that contains handler403 = ...
@override_settings(ROOT_URLCONF=__name__)
class CustomErrorHandlerTests(SimpleTestCase):
def test_handler_renders_template_response(self):
response = self.client.get("/403/")
# Make assertions on the response here. For example:
self.assertContains(response, "Error handler content", status_code=403)
python manage.py test를 사용하고 test 파일은 TestCase 등의 테스트를 위한 클래스를 상속받아서 작성하면 장고가 알아서 test파일을 찾아서 실행하고 결과를 반환한다.async def를 사용해 비동기 함수가 될 수도 있다.import datetime
from django.http import HttpResponse
async def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)