http 요청 처리 프로세스에 대한 Django 클래스 뷰(class base view)

3053 단어 Django
Django 공식에 따르면 Django 개발 과정에서 우리는 function-base-view (함수 보기) 와clase-base-view (클래스 보기) 를 사용하여 http 요청과 관련된 처리를 실현할 수 있다.함수 보기와 클래스 보기는 우열을 구분하지 않아서 각각 좋은 점이 있다.
함수 보기에서 http 요청을 처리할 때 리퀘스트를 직접 호출할 수 있습니다.method 속성은 http 요청의 유형을 판단합니다. 예를 들어:
from django.http import HttpResponse

def my_view(request):
    if request.method == 'GET':
        # 
        return HttpResponse('result')

클래스 보기를 사용할 때 http 요청 처리를 실현할 때 모든 요청을 클래스로 작성할 수 있습니다. 기본 클래스 뷰에서 계승하고 get () 방법을 작성하면 HTTP에서 get () 요청을 할 때 사용자 정의 get () 방법과 자동으로 일치합니다.
from django.http import HttpResponse
from django.views import View

class MyView(View):
    def get(self, request):
        # 
        return HttpResponse('result')

우선view에서.generic.base.py에서 정의된 http 요청 형식을 찾을 수 있습니다:
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

HTTP가 요청을 시작하면 클래스 보기를 통해 asview () 방법 전송 요청 형식, asview () 는 위에서 정의한 방법에 따라 반복해서 찾을 수 있습니다.구체적으로 assetup () 과 디스패치 () 방법을 각각 호출합니다. 디스패치 () 방법은python 클래스의 내장 함수 getattr () 방법으로 현재 확장 클래스에서 HTTP 요청과 일치하는 클래스가 있는지 찾습니다. 예를 들어 get () 처리 방법입니다.상응하는 방법을 찾으면 asview () 는 이 사용자 정의 방법의 결과를 되돌려줍니다:
        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            if hasattr(self, 'get') and not hasattr(self, 'head'):
                self.head = self.get
            self.setup(request, *args, **kwargs)
            if not hasattr(self, 'request'):
                raise AttributeError(
                    "%s instance has no 'request' attribute. Did you override "
                    "setup() and forget to call super()?" % cls.__name__
                )
            return self.dispatch(request, *args, **kwargs)
        view.view_class = cls
        view.view_initkwargs = initkwargs

        # take name and docstring from class
        update_wrapper(view, cls, updated=())

    def setup(self, request, *args, **kwargs):
        """Initialize attributes shared by all view methods."""
        self.request = request
        self.args = args
        self.kwargs = kwargs

    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)

이렇게 하면 Django 개발 과정에서 클래스 보기, 예를 들어 View,ListView,DetailView,TemplateView에 사용할 때 클래스 방법을 작성하는 방식으로 get,post 등 요청 처리를 사용자 정의할 수 있고 후속 개발에서 이러한 방법을 유연하게 다시 써서 수요를 달성할 수 있다.

좋은 웹페이지 즐겨찾기