CBV源码执行流程:
class StudentView(View):
def get(self, request):
return JsonResponse({'message': 'GET请求发送成功'})
def post(self, request):
return JsonResponse({'message': 'POST请求发送成功'})
def put(self, request):
return JsonResponse({'message': 'PUT请求发送成功'})
def delete(self, request):
return JsonResponse({'message': 'DELETE请求发送成功'})
path('student/', StudentView.as_view()),
- 当浏览器访问/student/路由的时候,会执行as_view()的调用,as_view()返回了一个函数名叫view,所以访问/student/路由的时候,真正是在调用这个view()函数;
def view(request, *args, **kwargs):
# 创建了StudentView类的对象self
self = cls(**initkwargs)
...
# 使用StudentView类的对象self,调用一个方法叫dispatch(),默认去父类中调用这个方法。
# 这个返回值,才是get()/post()方法返回的Response,此时才交给浏览器。
return self.dispatch(request, *args, **kwargs)
- view()函数又执行了dispatch(),这个dispatch方法内部,才真正的去执行StudentView类中的那些方法。
def dispatch(self, request, *args, **kwargs):
# 获取当前请求的方法并且转化成小写,判断是否存在于方法列表中
if request.method.lower() in self.http_method_names:
# 如果存在,使用getattr()这个映射函数,将self和request.method.lower()进行映射,从得到一个handler值,这个值就是方法名(get, post,...)
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
# 调用hanlder(),其实就是在调用StudentView类中的方法。调用get()、post()得到一个Response()对象,这个对象并没有直接返回给浏览器。而是返回到了view()函数中
return handler(request, *args, **kwargs)