drf入口请求流程和对request的封装

259 阅读2分钟

drf入口请求流程,以及request的封装

drf入口请求流程

1、路由

urlpatterns = [
    path('order/', views.OrderView.as_view()),
]

2、视图关系

class View(object):
    @classonlymethod
    def as_view(cls, **initkwargs):
        def view(request, *args, **kwargs):
            return self.dispatch(request, *args, **kwargs)
        return view
    
class APIView(View):
    
    @classmethod
    def as_view(cls, **initkwargs):
        view = super().as_view(**initkwargs)
        return csrf_exempt(view)
    def dispatch(self, request, *args, **kwargs):
        # 新request对象内部包含老request(_reuqest=老request)
        request = self.initialize_request(request, *args, **kwargs)
        self.request = request
        
        self.initial(request, *args, **kwargs)
        
        # 通过反射执行“get”方法,并传入新的request
        handler = getattr(self, request.method.lower())
        response = handler(request, *args, **kwargs) # get(requst)
        return self.response
    
class OrderView(APIView):
    
    def get(self,request,*args,**kwargs):
        return Response('海狗')

image-20220701095643307

image-20220701094423723

3、drf请求生命周期

一个请求过来之后,需要先穿过中间件,依次执行中间件里边的process_request()方法,执行完process_request()之后,如果中间件里边实现了process_view()方法,再依次执行中间件各个process_view()方法,接下来就到了路由系统进行路由匹配,如果是FBV,路由匹配成功后,执行对应的视图函数,视图函数可以基于ORM去数据库中拿数据,也可以渲染模板,返回字符串给浏览器,服务器在返回响应给浏览器时,需要再次经过中间件,依次去执行process_response()方法,如果是CBV,那么会先执行源码里边的dispatch方法,dispatch()方法根据请求的类型找到对应的函数,比如我们的请求是GET形式,它会找到get()函数,执行里边的代码,然后把结果返回给浏览器,返回的过程中也要经过中间件,执行中间件的process_response方法。 image-20220911161455926

drf 对request的封装

drf中的request其实是对请求的再次封装,其目的就是在原来的request对象基础中再进行封装一些drf中需要用到的值。

image-20220913162423819

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.request import Request
​
​
class UserView(APIView):
    def get(self, request, *args, **kwargs):
        # drf的request对象
        print(request.query_params)
        print(request.data)
        print(request.auth)
        print(request.user)
​
        # django的request对象
        print(request.GET)
        print(request.method)
        print(request.path_info)
        return Response("...")