CBV加装饰器、as_view的执行流程、继承View写cbv、cbv中得methods作用

CBV加装饰器

类属性中加入,加入decorators = [auth, ],属性是一个列表,按照列表顺序,依次给每个方法加装饰器
    
     def as_view(cls, name, *class_args, **class_kwargs ) :
		...
		if cls.decorators:
			for decorator in cls.decorators:
				'''
					# 装饰器原理:
					@auth
					def view():
					本质是  view=auth(view)  
				'''
				# 给view加装饰器----》给视图类中得方法加装饰器
				view = decorator(view) 
			return view

as_view的执行流程

# as_view的执行流程
    def as_view(cls, name, *class_args, **class_kwargs):
        def view(**kwargs):
            return self.dispatch_request(**kwargs)
        return view
 
    -请求来了,路由匹配成功,会执行as_view内的view()----》self.dispatch_request---》MethodView的dispatch_request
    -MethodView的dispatch_request
      def dispatch_request(self, **kwargs):
        # 在当前视图类中反射,请求方式的小写字符串(get),我们写了get方法
        meth = getattr(self, request.method.lower(), None)
        # 执行get()
        return meth(**kwargs) 

Login.as_view(name='index') name到底有什么用

# Login.as_view(name='index')  name到底有什么用,还必须传
	-先研究 endpoint 有什么用,正常的fbv,如果不写endpoint,会以函数名作为别名,endpoint如何设置的
    -如果endpoint为None,它把函数名作为了endpoint
      if endpoint is None:
            endpoint = _endpoint_from_view_func(view_func)# view_func.__name__
        options["endpoint"] = endpoint
        
   -Login.as_view(name='index'),name到底有啥用
		-app.add_url_rule('/login', view_func=Login.as_view('login'))
    	-没有传endpoint,Login.as_view('login')是 view函数的内存地址,
        -endpoint会以函数名作为endpoint的值,现在所有函数都是view,必须传入name,来修改调view函数的名字
        -如果传了endpoint,别名以endpoint为主,如果不传endpoint,别名以name为主
        app.add_url_rule('/login', view_func=Login.as_view(name='login'),endpoint='xxx')

继承View写cbv

# 继承View写视图类(CBV)
    -1 继承 View 的视图类,执行流程都是一样的
    -2 请求来了,路由匹配成功,执行self.dispatch_request
    -3 self.dispatch_request 没有实现,直接抛异常NotImplementedError()
    -4 必须重写 dispatch_request,自己写匹配规则,执行不同的方法

cbv中得methods作用

# 视图类中还有个类属性 methods = ['POST']
    -用来控制允许的请求方式
    -如果不写,写了什么方法,就允许什么请求
posted @ 2022-12-13 19:00  张张包~  阅读(19)  评论(0编辑  收藏  举报