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('海狗')
3、drf请求生命周期
一个请求过来之后,需要先穿过中间件,依次执行中间件里边的process_request()方法,执行完process_request()之后,如果中间件里边实现了process_view()方法,再依次执行中间件各个process_view()方法,接下来就到了路由系统进行路由匹配,如果是FBV,路由匹配成功后,执行对应的视图函数,视图函数可以基于ORM去数据库中拿数据,也可以渲染模板,返回字符串给浏览器,服务器在返回响应给浏览器时,需要再次经过中间件,依次去执行process_response()方法,如果是CBV,那么会先执行源码里边的dispatch方法,dispatch()方法根据请求的类型找到对应的函数,比如我们的请求是GET形式,它会找到get()函数,执行里边的代码,然后把结果返回给浏览器,返回的过程中也要经过中间件,执行中间件的process_response方法。
drf 对request的封装
drf中的request其实是对请求的再次封装,其目的就是在原来的request对象基础中再进行封装一些drf中需要用到的值。
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("...")