CBV源码解析

1、CBV(class based view)

首先定义一个视图函数,用类的方式定义:

举例:

class LoginView(View):

        def get(self,request):
            return render(request,"login.html")

url的设计:

#url(r'^login/', views.LoginView.as_view()),

可以直接点击as_view进入,但是我们正常走的话就是进入LoginView,继承了View,然后是执行类里边的as_view方法,as_view是个类方法,执行后肯定有一个返回值,这个返回值就是view,

#url(r'^login/', View.view),

然后是用户访问的时候执行的:

一旦用户get访问login:

走到view方法里边,执行self.dispatch,self就是我们自己定义的LoginView的实例对象。

#login-----》view(request):
                     self = cls(**initkwargs)
                     return self.dispatch(request, *args, **kwargs):

然后看这个类有没有dispatch方法,在我们自己定义的里边没有写,但是继承view里边有这个方法(源码里边的东西):

 def dispatch(self, request, *args, **kwargs):
        # 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:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)

简单来说就是:请求方式的分发,如果是get请求,执行get,是什么就执行什么:

# 分发
                                    handler = getattr(self, request.method.lower())
                                    
                                    return handler(request, *args, **kwargs):
                                           def get(self,request):
                                                    return render(request,"login.html")
原文地址:https://www.cnblogs.com/hnlmy/p/9662798.html