zoukankan      html  css  js  c++  java
  • 05 DRF请求生命周期

    DRF请求生命周期

    1. 根据应用中urls.py,走as_view方法,但是视图类没有该方法,所以请求走的是APIView的as_view方法
    2. 在APIView的as_view调用父类(django原生View)的as_view,同时还禁用了 csrf 认证
    3. 在父类(django原生View)的as_view中dispatch方法请求走的又是APIView的dispatch
      因为APIView也可以走dispatch,视图类是先继承APIView,APIView中没有再去原生View中
    4. 完成任务分发,交给视图类的请求函数处理,得到请求的响应结果,返回给前台,所以以后直接就从APIView的dispatch入口看源码

    前期准备

    #路由层 urls.py:
    from django.conf.urls import url,include
    from django.contrib import admin
    from . import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^test/', views.test.as_view()),
    ]  
    
    #视图层 views.py
    from django.shortcuts import render
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    class test(APIView):
        def get(self,reqeust,*args,**kwargs):
            return Response('drf get ok')
        def post(self,request,*args,**kwargs):
            return Response('drf post ok')
    

    源码分析

    1. 根据应用中urls.py,走as_view方法,但是视图类没有该方法,所以请求走的是APIView的as_view方法

    2. view = super().as_view(**initkwargs)调用父类的as_view 也就是django原生的base.py中的as_view
      之后再此基础上增加了 return csrf_exempt(view) 继承了APIView的视图类,会禁用csrf认证,这样就需要在settings中注释

    3. 在第二步是调用父类的as_view方法,此方法中有个关键的分发方法return self.dispatch(request, *args, kwargs) (入口:view = super().as_view(initkwargs))

    4. APIView中重写了dispatch方法

    5. 完成任务方法交给视图类的请求函数处理,得到请求的相应结果,返回给前台

  • 相关阅读:
    DES算法实现
    2018-2019-2 20175226 实验五《网络编程与安全》实验报告
    2018-2019-2 20175226王鹏雲 实验四《Android程序设计》实验报告
    第05组 Beta冲刺(1/4)
    Alpha事后诸葛亮
    第05组 Alpha冲刺(4/4)
    第05组 Alpha冲刺(3/4)
    第05组 Alpha冲刺(2/4)
    第05组 Alpha冲刺(1/4)
    第05组 团队Git现场编程实战
  • 原文地址:https://www.cnblogs.com/LYPZX/p/14045084.html
Copyright © 2011-2022 走看看