머리말
Django를 배우는 것이 실제로 매우 간단하고 거의 노력하지 않고도 시작할 수 있다는 것은 누구나 알고 있습니다. URL을 구성하고 이를 처리할 함수에 할당하고 응답을 반환하는 것에 대해 이해하기 어려운 것은 거의 없습니다.
글을 많이 쓸수록 문제점을 깨닫게 됩니다. 예를 들어, 한 뷰는 상대적으로 복잡하고 다른 많은 함수를 호출합니다. 이러한 기능을 캡슐화하려면 어떻게 해야 합니까? 물론 #------view------ 주석을 사용하여 기능을 분리할 수 있습니다. 이 방법은 단순히 자신을 속이는 것입니다.
Python은 객체지향 프로그래밍 언어입니다. 함수만 사용하여 개발한다면 객체지향의 많은 장점(상속, 캡슐화, 다형성)을 놓치게 됩니다. 그래서 Django는 나중에 Class-Based-View를 추가했습니다. 클래스를 사용하여 View를 작성할 수 있습니다. 이것의 장점은 크게 두 가지입니다.
코드의 재사용성을 높이고 Mixin(다중 상속)과 같은 객체지향 기술을 사용할 수 있습니다
코드 가독성을 높이기 위해 많은 if 판단을 사용하는 대신 다양한 함수를 사용하여 다양한 HTTP 메소드를 처리할 수 있습니다.
클래스 사용- 기반 뷰
GET 메소드를 처리하는 뷰를 작성하고 싶다면, 함수를 이용하여 작성하면 다음과 같습니다.
from django.http import HttpResponse def my_view(request): if request.method == 'GET': # <view logic> return HttpResponse('result')
클래스 기반 뷰로 작성하면 이렇습니다.
from django.http import HttpResponse from django.views import View class MyView(View): def get(self, request): # <view logic> return HttpResponse('result')
Django의 URL은 클래스가 아닌 호출 가능한 함수에 요청을 할당합니다. 이 문제를 해결하기 위해 클래스 기반 뷰는 as_view()
정적 메서드(즉, 클래스 메서드)를 제공합니다. 이 메서드를 호출하면 클래스의 인스턴스가 생성되고, 해당 인스턴스를 통해 dispatch()
메서드가 호출됩니다. > 메소드는 요청에 따라 호출됩니다. 다른 메소드는 요청을 처리하기 위해 해당 메소드를 호출합니다(예: dispatch()
, get()
등). 이 시점에서 이러한 메서드는 요청을 받고 응답을 다시 받아야 하는 함수 기반 뷰와 거의 동일합니다. 메서드가 정의되지 않은 경우 HttpResponseNotAllowed 예외가 발생합니다. post()
# urls.py from django.conf.urls import url from myapp.views import MyView urlpatterns = [ url(r'^about/$', MyView.as_view()), ]
from django.http import HttpResponse from django.views import View class GreetingView(View): greeting = "Good Day" def get(self, request): return HttpResponse(self.greeting) # You can override that in a subclass class MorningGreetingView(GreetingView): greeting = "Morning to ya"
urlpatterns = [ url(r'^about/$', GreetingView.as_view(greeting="G'day")), ]
Mixin 사용
데코레이터 사용
from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from django.views.generic import TemplateView class ProtectedView(TemplateView): template_name = 'secret.html' @method_decorator(login_required) def dispatch(self, *args, **kwargs): return super(ProtectedView, self).dispatch(*args, **kwargs)
@method_decorator(login_required, name='dispatch') class ProtectedView(TemplateView): template_name = 'secret.html'
decorators = [never_cache, login_required] @method_decorator(decorators, name='dispatch') class ProtectedView(TemplateView): template_name = 'secret.html' @method_decorator(never_cache, name='dispatch') @method_decorator(login_required, name='dispatch') class ProtectedView(TemplateView): template_name = 'secret.html'