from rest_framework.views import APIView
class APIView(View):
...
@classmethod
def as_view(cls, **initkwargs):
...
# super方法调用父类(也就是View)的as_view方法,这个as_view返回其view方法的内存地址,
view = super().as_view(**initkwargs)
# 函数也是对象,可以给它加属性
view.cls = cls
view.initkwargs = initkwargs
# 继承了APIView这个类的话,以后所有的请求都没有csrf认证了
return csrf_exempt(view)
#父类View的as_view方法里面的view函数返回:self.dispatch(request, *args, **kwargs),self是自定义视图类(这个类继承了APIView)的对象,找到的是APIView里面的dispatch
def dispatch(self, request, *args, **kwargs):
"""
`.dispatch()` is pretty much the same as Django's regular dispatch,
but with extra hooks for startup, finalize, and exception handling.
"""
self.args = args
self.kwargs = kwargs
# 传入的request是django原生的request,经过处理以后和原生的不一样了
request = self.initialize_request(request, *args, **kwargs)
self.request = request
self.headers = self.default_response_headers # deprecate?
try:
self.initial(request, *args, **kwargs)
# Get the appropriate handler method
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)
except Exception as exc:
response = self.handle_exception(exc)
# 把响应的东西包装一下,根据请求客户端的不同,返回不同的东西,比如是浏览器发来的请求,就返回一个页面,postman的请求,就返回json格式数据
self.response = self.finalize_response(request, response, *args, **kwargs)
return self.response
APIView的initial方法
def initial(self, request, *args, **kwargs):
...
'''
'''
self.perform_authentication(request)
'''
'''
self.check_permissions(request)
'''
'''
self.check_throttles(request)