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']
-用来控制允许的请求方式
-如果不写,写了什么方法,就允许什么请求