python学习笔记之-CBV

CBV(class base views)

即在视图里通过类处理请求

首先处理类需要继承View

在路由系统配置请求对应的处理类的as_view()方法

    url(r'^obj/', views.obj.as_view()),

当请求执行时根据url执行处理类的父类as_view()方法

在方法中首先通过 self = cls(**initkwargs) 实例化

然后执行处理类的 self.dispatch() 方法,如果处理类没有 dispatch() 方法则执行其父类方法

在 dispatch() 方法中判断请求是否包含在 HTTP 的请求方法中,如果存在则通过反射获取对应函数,然后执行并返回客户端

# as_view() 代码片段

    def as_view(cls, **initkwargs):

        def view(request, *args, **kwargs):

            self = cls(**initkwargs)

            if hasattr(self, 'get') and not hasattr(self, 'head'):

                self.head = self.get

            self.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

# dispatch() 代码片段

        def dispatch(self, request, *args, **kwargs):

        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)

你可能感兴趣的:(python学习笔记之-CBV)