CBV源码执行流程

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()),
  1. 当浏览器访问/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)
  1. 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)

猜你喜欢

转载自blog.csdn.net/zhangmengran/article/details/84797932
CBV
今日推荐