django---APIView 소스 분석

3428 단어
django---APIView 소스 분석
선언: APIView는 View를 기반으로 이 섹션을 보려면 django-CBV의 내용을 알아야 합니다.
django-CBV 원본 분석에서 우리는 분석한from django입니다.views import View의 실행 프로세스views 모듈 아래의view는 어떤 관련이 있습니까?우리는 여전히 urls.py 설정에서 착안하여 분석한다
from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^publishes/', views.PublishView.as_view()),
]
views.py
from rest_framework.views import  APIView

class PublishView(APIView):

    def get(self,request):
        publish_list=Publish.objects.all()
        ret=serialize("json",publish_list)

        return HttpResponse(ret)

    def post(self,request):
        pass

1、우선 우리는 urls.pyas_view 누가 집행했는지 확인합니까?우선 우리는 views.PublishView에서 찾았는데 찾지 못했다. 그래서 우리는 이어서 PublishView의 부류APIView에서 찾았다. 찾았기 때문에 호출APIView.as_view()을 실행했다. 내용은 다음과 같다.
class APIView(View):

    #           
    @classmethod
    def as_view(cls, **initkwargs):
        if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet):
            def force_evaluation():
                raise RuntimeError(
                    'Do not evaluate the `.queryset` attribute directly, '
                    'as the result will be cached and reused between requests. '
                    'Use `.all()` or call `.get_queryset()` instead.'
                )
            cls.queryset._fetch_all = force_evaluation
        
        # 1. super     as_view        view    
        view = super(APIView, cls).as_view(**initkwargs)
        view.cls = cls
        view.initkwargs = initkwargs

        # Note: session based authentication is explicitly CSRF validated,
        # all other authentication is CSRF exempt.
        
        # csrf_exempt       csrf_token     
        #           
        # 2.      view    View.view
        return csrf_exempt(view)

2、모두들 이렇게 끝나는 줄 알았죠?NO!NO!NO! as_view View as_view,dispatch View dispatch라면 rest-framework는 폐폐폐가 되지 않겠는가?as_view의 실행 결과는 디스패치의 실행 결과입니다. 디스패치나 View의 디스패치입니까?
  • 우리 먼저views를 봅시다.PublishView에 디스패치가 있는지 없는지 발견
  • 우리는views에 있다.PublishView의 상위 APIView, 검색
  • 그래서 디스패치는 APIView입니다.dispatch 비 View.dispatch
  • APIView.dispatch 안에 구성 요소가 한 무더기 있는데, 여기는 말하지 않습니다
  • 중간에 있는 이 코드는 이전의 View와 같습니다.dispatch 마찬가지: 요청을 나눠주고 요청 외에 또 한 무더기의 일을 했다
        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
    
        response = handler(request, *args, **kwargs)

    요약:
    url 변환 과정
  • url(r'^publishes/', views.PublishView.as_view()),
  • url(r'^publishes/', APIView.as_view()),
  • url(r'^publishes/', View.as_view()),

  • View.as_view () 우리는django - CBV에서 설명했기 때문에 마지막으로 호출하는 것은 API View일 뿐입니다.as_view는 그 안에 자기가 정의한 것들을 넣었는데, 단지 우리가 사용하지 않았을 뿐이다
    APIView.as_view()---> View.as_view()---> APIView.dispatch()--->response--->handler()-->요청 방법 함수의 반환 결과를 스스로 정의하지 않으면 405를 잘못 던집니다.
    전재 대상:https://www.cnblogs.com/moyand/p/9401380.html

    좋은 웹페이지 즐겨찾기