CBV源码分析
# ModelViewSet继承View(django原生View) # APIView继承了View # 先读View # urls.py path('books1/', views.Books.as_view()), # 在这个地方应该写一个函数内存地址,views.Books.as_view()执行完,是一个函数内存地址,as_view是一个类方法,类直接来调用,会把类自动传入 放了一个view的内存地址(View--->as_view--->内层函数) # 请求来了,如果路径匹配,会执行,函数内存地址(request) def view(request, *args, **kwargs): # request是当次请求的request self = cls(**initkwargs) # 实例化得到一个对象,Book对象 if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get self.setup(request, *args, **kwargs) if not hasattr(self, 'request'): raise AttributeError( "%s instance has no 'request' attribute. Did you override " "setup() and forget to call super()?" % cls.__name__ ) return self.dispatch(request, *args, **kwargs) def dispatch(self, request, *args, **kwargs): # request是当次请求的request self是book对象 if request.method.lower() in self.http_method_names: # handler现在是 # handler = getattr(self,'get') 你写的Book类的get方法的内存地址 handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) # 执行get(request)