Flask的CBV写法与源码分析

news/2024/10/21 7:50:42/

CBV 写法

from flask import Flask
from flask.views import MethodViewapp = Flask(__name__)class Index(MethodView):def get(self):return 'get'def post(self):return 'post'app.add_url_rule('/index',view_func=Index.as_view(name='index'))if __name__ == '__main__':app.run()

注意:as_view( name= )中必须要写上name,并且后面跟的值不能重复,这个name 其实就是别名,最终就是fbv中的 endpoint

 

CBV源码分析

分析as_view的源码

传入参数:cls=Index,name='index'

    @classmethoddef as_view(cls, name, *class_args, **class_kwargs):def view(*args, **kwargs):self = view.view_class(*class_args, **class_kwargs)return self.dispatch_request(*args, **kwargs)if cls.decorators:view.__name__ = nameview.__module__ = cls.__module__for decorator in cls.decorators:view = decorator(view)view.view_class = clsview.__name__ = nameview.__doc__ = cls.__doc__view.__module__ = cls.__module__view.methods = cls.methodsview.provide_automatic_options = cls.provide_automatic_optionsreturn view

首先观察到 as_view 返回的就是 内层的函数 view,也就是说,当路由匹配成功之后就是执行内层的 view 函数

view 函数 首先将传入的视图类 实例化生成一个对象,然后执行该对象的 dispatch_request方法

该方法就类似于 Django 中的dispatch方法

重点在于传入的name参数 => view.__name__ = name=> 其实就是将内层函数 view 的名字改成了传入的 “index”

name 必传的原因

# 由Index.as_view() ==> 如果不传
# name,Index.as_view()的执行结果就是 view 函数
由于app.add_url_rule(self, rule= ,view_func= ,... )函数的执行可知,此时传入的view_func = view, 而且此时没有传入endpoint! 
'所以,该路由默认的别名就是 view 而不是视图类的名字'
'这就可能导致所有的视图类都是同一个别名--view'
所以,必须传入一个name参数

 

dispatch_request源码

该方式是在MethodView 中,View 类中没有,所以如果继承了 View 类需要重写该方法

这里需要注意:只会执行视图类中跟请求方式同名的方法

    def dispatch_request(self, *args, **kwargs):meth = getattr(self, request.method.lower(), None)# If the request method is HEAD and we don't have a handler for it# retry with GET.if meth is None and request.method == 'HEAD':meth = getattr(self, 'get', None)assert meth is not None, 'Unimplemented method %r' % request.methodreturn meth(*args, **kwargs)

 

View 类属性

CBV 书写必须继承 View 类(MethodView继承 View 类)

class View(object):methods = Noneprovide_automatic_options = Nonedecorators = ()def dispatch_request(self):raise NotImplementedError()... ...

methods中写允许的请求方式

decorators中写装饰给view函数的装饰器,因为CBV本质就是执行view函数

decorators元组中越靠前的,离 view函数越近,越先装饰


http://www.ppmy.cn/news/61342.html

相关文章

libfacedetection 人脸检测库 检测速度慢的问题

目录 一、libfacedetection 性能介绍 英特尔CPU 使用AVX2指令集 使用AVX512指令集 嵌入式设备 二、加速检测速度 libfacedetetion的前向推理速度很快的原因 使用axv2加速指令 一、libfacedetection 性能介绍 在上一篇文章中,我发现使用摄像头检测,构…

华为EC6108V9E/EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包

华为EC6108V9E/EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包-内有教程 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的…

Kettle安装与使用

一、Kettle简介 Kettle最早是一个开源的ETL(Extract-Transform-Load的缩写)工具,全称为KDE Extraction, Transportation, Transformation and Loading Environment。后来Kettle重命名为Pentaho Data Integration 。它由Java开发,…

基于改进的离散PSO算法的FJSP的研究(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

学计算机的要不要考研?校招工作不喜欢怎么办?怎样才可以年薪百万?

昨天有粉丝私信我 学的计算机 说他大四马上就要毕业了 然后学校分配的这个工作不是很喜欢 问要不要换个方向 然后身边还有一些同学去考研了 说他要不要考研 等等比较典型的一些问题 所以我总结了一下有三个问题 第一个问题 就学计算机的现在工作不好找 要不要考研 第二个问题就…

BetaFlight统一硬件配置文件研读

BetaFlight统一硬件配置文件研读 1. 源由2. 分析2.1 硬件SOC2.2 统一配置文件2.3 cli命令2.4 板级配置主要命令2.4.1 board_name2.4.2 manufacturer_id2.4.3 resource2.4.4 timer2.4.5 dma2.4.6 serial2.4.7 set2.4.8 feature 3. 实例研读3.1 C遗留配置3.2 BoardName - AOCODAR…

普通2本,去过字节外包,到现在年薪25W+的测试开发,我的2年转行心酸经历...

个人简介 我是一个普通二本大学机械专业毕业,17年毕业,19年转行,目前做IT行业的软件测试已经有3年多,职位是高级测试工程师,坐标上海… 我想现在我也有一点资格谈论关于转行这个话题;希望你在决定转行之前…

浅谈Spring中的BeanFactory与FactoryBean

前言 理解FactoryBean是非常非常有必要的,因为在Spring中FactoryBean最为典型的一个应用就是用来创建AOP的代理对象,不仅如此,而且对理解Mybatis核心源码也非常有帮助!如果甘愿crud,做个快乐的码农,那我就哦…