django系列五(JsonResponse,request方法,CBV等)

时间:2025-02-15 18:52:33
请求方法:http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] @classonlymethod def as_view(cls, **initkwargs): #绑定类方法调用类属性调用这个类会将类传入 """ Main entry point for a request-response process. """ for key in initkwargs: if key in cls.http_method_names: raise TypeError("You tried to pass in the %s method name as a " "keyword argument to %s(). Don't do that." % (key, cls.__name__)) if not hasattr(cls, key): raise TypeError("%s() received an invalid keyword %r. as_view " "only accepts arguments that are already " "attributes of the class." % (cls.__name__, key)) def view(request, *args, **kwargs): self = cls(**initkwargs) # 生成一个类对象 if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get # 如果有get且没有head,那么让head=get self.request = request # 拿到request # 接受参数 self.args = args self.kwargs = kwargs return self.dispatch(request, *args, **kwargs) view.view_class = cls view.view_initkwargs = initkwargs # take name and docstring from class update_wrapper(view, cls, updated=()) # and possible attributes set by decorators # like csrf_exempt from dispatch update_wrapper(view, cls.dispatch, assigned=()) return view def dispatch(self, request, *args, **kwargs): # self是在view内部创建的对象 # Try to dispatch to the right method; if a method doesn't exist, # defer to the error handler. Also defer to the error handler if the # request method isn't on the approved list. if request.method.lower() in self.http_method_names: # http_method_names有8中方法,get,post等等 handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed # handler会按照查找顺序找应该有的方法,如果没有则返回默认的报错信息 return handler(request, *args, **kwargs) # 返回函数,此时就为视图函数 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()) # 返回页面