flask---CBV使用和源码分析

1 cbv写法

-1 写个类,继承MethodView
    -2 在类中写跟请求方式同名的方法
    -3 注册路由:app.add_url_rule('/home', view_func=Home.as_view('home'))
  #home是endpoint,就是路由别名

#例子
class add(MethodView):
    def get(self):
        return 'holle'

app.add_url_rule('/add',view_func=add.as_view('add'))

2 cbv加装饰器

-方式一:
	class Home(MethodView):
    	decorators = [auth]  # 之前加载fbv上的,直接拿过来用即可
-方式二:
    class Home(MethodView):
        @auth  # 这个auth需要单独写,跟加载fbv上的不一样
    	def get(self):
        	return render_template('home.html')

3 允许的请求方式

class Home(MethodView):
        methods = ['GET']  # 控制能够允许的请求方式

4.

5 为什么decorators = [auth] 能加装饰器

cbv源码
if cls.decorators:
    view.__name__ = name
    view.__module__ = cls.__module__
    for decorator in cls.decorators:      #decorator 就是装饰器auth
      view = decorator(view)               #add = auth(add)

app.add_url_rule('/home', view_func=view内存地址)
    用装饰器一直在装饰 view内存地址 ,所以,以后执行,就是有装饰器的view,装饰器代码会走
    @auth
    def view(**kwargs):
        return self.dispatch_request(**kwargs)
    等价于
    view = auth(view)

6

view_func=Home.as_view('home')  home 是 endpoint,就是路由别名
	-1 app.add_url_rule('/home', view_func=Home.as_view('home'))
    -2 add_url_rule---》endpoint没传---》会执行endpoint = _endpoint_from_view_func(view_func)
    -3 取函数名作为 endpoint 的值
    -4 view_func是 加了一堆装饰器的view函数---》它的名字应该是装饰器的名字--》但是
    	view.__name__ = name  # name 就是home
    -5 所以endpoint就是你传的home
    -6 如果传了endpoint,就是传的那个,那as_view('home')就没作用了,但是也必须要传

7.as_view源码


# View的as_view
@classmethod
def as_view(cls, name, *class_args, **class_kwargs) :
       def view(**kwargs):
            return self.dispatch_request(**kwargs)

        if cls.decorators:   # 咱们的装饰器
            view.__name__ = name
            view.__module__ = cls.__module__
            for decorator in cls.decorators: #每次拿出一个装饰器,
                view = decorator(view) # 装饰器语法糖干的事: 把被装饰的函数当参数传入到装饰器,返回结果赋值给被装饰的函数,一个个用装饰器包装view
        view.__name__ = name

        return view
    

# self.dispatch_request---》MethodView
def dispatch_request(self, **kwargs) :
    # 取到request.method.lower()请求方式小写 ---》假设是get请求get
    # meth是 cbv中 以get命名的方法,反射出来了
    meth = getattr(self, request.method.lower(), None)
    return meth(**kwargs) # 执行cbv中跟请求方式同名的方法

你可能感兴趣的:(flask,flask,python,后端)