# CBV基于类的视图。 定义一个类,加上路由。。 class Mylogin(View): # 类里面的方法名不能随便写,目前只能写post和get def get(self, request): # 同时类里面的方法也要加上request print('get') return HttpResponse("get") # CBV中的路由选择是通过请求方式的不同来选择的,其路由文件中的路由地址不变 # 可以通过form表单来发送post请求 def post(self, request): print('post') return HttpResponse('post') # CBV的源码分析 """ 1.在路由信息中,url('^qq/',views.Mylogin.as_view()), 首先Mylgin类会先在@classonlymethod装饰的作用下,会调用该方法,并传递给第一个即cls形参 2.在as_view方法中,有一个自定义函数view,并最后返回该函数,所以会相当于path('login/', View.view) 3.开始匹配路由,调用该函数 4.执行view()里面的方法, def view(request, *args, **kwargs): # self = MyLogin(**initkwargs)#此时cls相当于Mykogin,类名加括号后实例化,得到了一个对象 self = cls(**initkwargs) self: MyLogin()即MyLogin()对象 return self.dispatch(request, *args, **kwargs) # 这句话是最重要的 4.return 后面用 self.dispatch来用对象调用方法, 在对象中找不到这个方法,再去产生这个对象的类中去寻找即MyLogin(),MyLogin()中找不到再去其继承的父类即View中去寻找 5.在View中找到dispatch方法 def dispatch(self, request, *args, **kwargs): #getttr反射:通过字符串,动态的操作对象的属性或方法 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 return handler(request, *args, **kwargs) 6.dispatch方法中 先判断请求方式的方法是否在self.http_method_names中,MyLogin()中找不到再去其继承的父类即View中去寻找该列表 http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] 若所定义的方法在这个里面则会执行getattr反射方法,找到该方法的属性,即找到get或者post方法,或者是自定义的方法,最后return加() 若不在这个里面则执行http_method_not_allowed()方法, def http_method_not_allowed(self, request, *args, **kwargs): logger.warning( 'Method Not Allowed (%s): %s', request.method, request.path, extra={'status_code': 405, 'request': request} ) return http.HttpResponseNotAllowed(self._allowed_methods()) 从该方法中可以看出若在Mylogin类中定义的方法不在这个列表中,则会执行该方法,首先会有一个警告日志,显示所自定义的方法名和路径名 再抛出一个405页面 """
cbv源码分析
于 2023-08-30 16:40:42 首次发布