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相关推荐

  1. flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识...

    flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识 flask中的CBV写法 后端代码 # 导入vie ...

  2. flask中的CBV和FBV

    flask中CBV使用 from flask import Flask, viewsapp = Flask(__name__)class Login(views.MethodView):methods ...

  3. flask中的request

    1.request是什么? 简单来说,它就是flask的封装的一个对象,这个对象包含着前端请求所带的所有信息.既然说它是一个对象,那么它肯定是有一些熟悉,和方法的,下面就来介绍下request里的熟悉 ...

  4. python flask 表单数据输出_将数据从HTML表单发送到Flask中的Python脚本

    我的Python脚本中有下面的代码: def cmd_wui(argv, path_to_tx): """Run a web UI.""" ...

  5. Flask框架(flask中的蓝图Blueprint)

    1. 我们学习Flask框架,开始的时候是把所有的视图函数等都写在一个文件中 我们在这单个文件中可以定义路由.视图函数.定义模型等等. 但这显然存在一个问题:随着业务代码的增加,将所有代码都放在单个程 ...

  6. Flask框架(flask-script扩展命令行和flask中数据库migrate扩展的使用)

    flask-script扩展命令行 1. 安装  : pip install  Flask-Script 2. 在程序中   from flask_script import Manager   '' ...

  7. Flask框架(flask中对cookie的处理(设置cookie、获取cookie、删除cookie))

    在Flask中对cookie的处理 1. 设置cookie: 设置cookie,默认有效期是临时cookie,浏览器关闭就失效 可以通过 max_age 设置有效期, 单位是秒 resp = make ...

  8. Flask框架(flask中设置响应信息的方法,返回json数据的方法)

    设置响应信息的方法 1.  返回自定义的响应头,有两种方式: (1)  第一种是:视图函数return的时候,使用元组,返回自定义的信息           返回的时候的状态码可以自定义信息:&quo ...

  9. python web开发-flask中日志的使用

    Flask使用日志记录的方式: 初始化flask应用实例 在flask中使用logger,需要初始化一个flask的应用 app = Flask(__name__) 2. 调用logger 直接调用l ...

最新文章

  1. Confluence 6 系统运行信息中的 JVM 内存使用情况
  2. linux 挂载错误 mount: unknown filesystem type LVM2_member 解决方法
  3. 让您的电脑在任意目录可以支持图片的粘贴,试试看呗(第二篇)~
  4. 大型网站典型故障案例分析
  5. 装服务器显示磁盘脱机,服务器磁盘处于脱机
  6. 存储过程双层循环_别出心裁,为锂金属负极贴上“双层保护膜”!
  7. 【数据结构、算法】八大排序算法概述(算法复杂度、稳定性)
  8. Django学习总结①
  9. python判断最小公倍数
  10. HTTP上传大文件的注意点
  11. 一篇文章让你彻底了解Java内部类
  12. 深入理解操作系统原理之文件系统
  13. Altium Designer中mm/mil单位切换
  14. 程序员、技术主管和架构师
  15. 两台主机如何共享一套键鼠一台显示器?
  16. chrome不跟随系统分辨率
  17. 把数字翻译成字符串(递归,动态规划)
  18. EwonCOSY 141 MPI EC51410【路由器】
  19. 获取svg元素的高度和宽度(或其他属性)
  20. 一入IT深似海 从此妹子为路人

热门文章

  1. java获取二维数组长度
  2. 点积、叉积及其几何意义
  3. 市场类型与完全竞争市场
  4. Java小项目——房屋出租系统
  5. 从IT 的角度看如何避免“薅羊毛”事件
  6. JS 获取滚动条到底部得距离
  7. GNU Emacs教程
  8. Windows10安装配置Maven
  9. Spring boot+Vue前后端分离项目实战——学生管理系统【三】后端
  10. 青年 | 如果不上班,我们还可以做什么?