Flask中的CBV
Flask中的CBV
在Flask中和Django一样有两种视图模式,一种是基于函数,一种是基于类。下面来讨论一下Flask的CBV模式。
首先,说明一下flask视图函数注册路由的本质:
其实,route装饰器内部也是通过调用add_url_rule()方法实现的路由注册,只是route装饰器看起来更加美观,
源码的route函数,如下
def route(self, rule, **options):def decorator(f):endpoint = options.pop("endpoint", None)self.add_url_rule(rule, endpoint, f, **options)return freturn decorator
下面我们来看一下CBV的书写方式:
class Login(views.MethodView):def get(self):return "hello"app.add_url_rule("/",view_func=Login.as_view("login"))
#view_func是add_url_rule(rule, endpoint, f, **options),的第三个参数f
要使用定义的视图类,必须要继承了MethodView,这个类继承了View类和MethodViewType类,内部封装了我们需要的功能
class MethodView(with_metaclass(MethodViewType, View)):
下面我们看一下as_view方法,
def as_view(cls, name, *class_args, **class_kwargs):"""Converts the class into an actual view function that can be usedwith the routing system. Internally this generates a function on thefly which will instantiate the :class:`View` on each request and callthe :meth:`dispatch_request` method on it.The arguments passed to :meth:`as_view` are forwarded to theconstructor of the class."""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)# We attach the view class to the view function for two reasons:# first of all it allows us to easily figure out what class-based# view this thing came from, secondly it's also used for instantiating# the view class so you can actually replace it with something else# for testing purposes and debugging.view.view_class = clsview.__name__ = name #view.__name__ = "login"#view是上面定义的函数,函数名.__name__就是这个函数的函数名,#这里我们就当于重新赋值了view这个函数的函数名view.__doc__ = cls.__doc__view.__module__ = cls.__module__view.methods = cls.methodsview.provide_automatic_options = cls.provide_automatic_optionsreturn view
经过上面对as_view的分析,我们知道,as_view返回了一个名字叫login的函数,然后开始进入add_url_rule方法,
def add_url_rule(self,rule,endpoint=None,view_func=None,provide_automatic_options=None,**options):if endpoint is None:endpoint = _endpoint_from_view_func(view_func)options["endpoint"] = endpointmethods = options.pop("methods", None)
刚开始endpoint为空,所以,进入if条件,执行_endpoint_from_view_func,
def _endpoint_from_view_func(view_func):"""Internal helper that returns the default endpoint for a givenfunction. This always is the function name."""assert view_func is not None, "expected view func if endpoint is not provided."return view_func.__name__
我们看到_endpoint_from_view_func返回了函数的名字,执行if条件内的语句后,
就得到了,endpoint=函数名,所以endpoint和view_func=Login.as_view(“login”)中的login名字是一样的。
总结来说,Flask的CBV本质上和FBV是一样的,都是执行add_url_rule方法,主要就是使用形式上的不同
个人理解如上,如有错误欢迎指出,一定改正,共勉。
参考文章:https://blog.csdn.net/m0_37519490/article/details/80608365
Flask中的CBV相关推荐
- flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识...
flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识 flask中的CBV写法 后端代码 # 导入vie ...
- flask中的CBV和FBV
flask中CBV使用 from flask import Flask, viewsapp = Flask(__name__)class Login(views.MethodView):methods ...
- flask中的request
1.request是什么? 简单来说,它就是flask的封装的一个对象,这个对象包含着前端请求所带的所有信息.既然说它是一个对象,那么它肯定是有一些熟悉,和方法的,下面就来介绍下request里的熟悉 ...
- python flask 表单数据输出_将数据从HTML表单发送到Flask中的Python脚本
我的Python脚本中有下面的代码: def cmd_wui(argv, path_to_tx): """Run a web UI.""" ...
- Flask框架(flask中的蓝图Blueprint)
1. 我们学习Flask框架,开始的时候是把所有的视图函数等都写在一个文件中 我们在这单个文件中可以定义路由.视图函数.定义模型等等. 但这显然存在一个问题:随着业务代码的增加,将所有代码都放在单个程 ...
- Flask框架(flask-script扩展命令行和flask中数据库migrate扩展的使用)
flask-script扩展命令行 1. 安装 : pip install Flask-Script 2. 在程序中 from flask_script import Manager '' ...
- Flask框架(flask中对cookie的处理(设置cookie、获取cookie、删除cookie))
在Flask中对cookie的处理 1. 设置cookie: 设置cookie,默认有效期是临时cookie,浏览器关闭就失效 可以通过 max_age 设置有效期, 单位是秒 resp = make ...
- Flask框架(flask中设置响应信息的方法,返回json数据的方法)
设置响应信息的方法 1. 返回自定义的响应头,有两种方式: (1) 第一种是:视图函数return的时候,使用元组,返回自定义的信息 返回的时候的状态码可以自定义信息:&quo ...
- python web开发-flask中日志的使用
Flask使用日志记录的方式: 初始化flask应用实例 在flask中使用logger,需要初始化一个flask的应用 app = Flask(__name__) 2. 调用logger 直接调用l ...
最新文章
- Confluence 6 系统运行信息中的 JVM 内存使用情况
- linux 挂载错误 mount: unknown filesystem type LVM2_member 解决方法
- 让您的电脑在任意目录可以支持图片的粘贴,试试看呗(第二篇)~
- 大型网站典型故障案例分析
- 装服务器显示磁盘脱机,服务器磁盘处于脱机
- 存储过程双层循环_别出心裁,为锂金属负极贴上“双层保护膜”!
- 【数据结构、算法】八大排序算法概述(算法复杂度、稳定性)
- Django学习总结①
- python判断最小公倍数
- HTTP上传大文件的注意点
- 一篇文章让你彻底了解Java内部类
- 深入理解操作系统原理之文件系统
- Altium Designer中mm/mil单位切换
- 程序员、技术主管和架构师
- 两台主机如何共享一套键鼠一台显示器?
- chrome不跟随系统分辨率
- 把数字翻译成字符串(递归,动态规划)
- EwonCOSY 141 MPI EC51410【路由器】
- 获取svg元素的高度和宽度(或其他属性)
- 一入IT深似海 从此妹子为路人