蓝图是模块级别的拆分,它不是设计来让你拆分试图函数的。要实现比模块级别下更具体的视图函数的拆分,例如在用Flask制作REST API时版本号下根据不同业务对象的函数拆分时,我们就需要自定义一个跟蓝图功能相同的模块。在这里,为了体现它跟蓝图的异曲同工之妙,我们将它命名为红图!

我们这里将示范上述场景中红图对象的制作。假设在v1版本的api中,有资源user, book等,我们希望对于每个资源对应的CURD方法分别放在各自的py文件中,如图所示:

我的文件结构是 app/api/v1/redpoint。

就像我们实例化蓝图对象一样,我们首先实例化我们的红图对象,虽然它暂时还未被定义,但我们会在后面补充它。我们分别在book.py和user.py里创建实例api:

# book.pyapi = Redprint('book')
# user.pyapi = Redprint('user')

对了,在使用我们的红图对象前别忘了先注册蓝图对象,因为我们同样需要将红图对象注册到蓝图上,就像蓝图注册到核心对象app上一样,在这里我就不演示在创建核心对象app工厂函数中注册蓝图的步骤了,但千万别忘了这一步哦。在蓝图v1/__init__.py中,在实例化蓝图对象后,注册红图:

from app.api.v1 import user, bookdef create_blueprint_v1():
bp_v1 = Blueprint(‘v1’,__name__)
user.api.register(bp_v1, url_prefix=’/user’) # 红图向蓝图的注册
book.api.register(bp_v1, url_prefix=’/book’)
return bp_v1

这个register方法将是我们稍后自定义的红图注册方法,它的实现方式主要参考蓝图的注册函数register_blueprint。

实现Redpoint

接下来我们便可以着手来编写Redpoint的具体实现方法了。试想一下,我们使用蓝图时都用到了哪些相关方法,除了上述的register,还有路由装饰器中的“.route”方法。我们定义:

class Redprint:def __init__(self, name):  self.name = namepassdef route(self):passdef register(self):pass

首先我们能想到的是,对于实例方法名字肯定是要传的。接下来怎么写呢?既然我们要参考蓝图的实现方式,那就Ctrl看看源码它对于接下来两个函数的实现,这是蓝图的route方法:

    def route(self, rule, **options):def decorator(f):endpoint = options.pop("endpoint", f.__name__)self.add_url_rule(rule, endpoint, f, **options)return freturn decorator

如果你对Flask的路由机制有所了解,你就知道它路由的实现其实就是内部调用了add_url_rule方法。它的参数”rule“就是我们装饰器中定义的url;就是我们定义的方法,也就是装饰器所作用的方法;endpoint照抄不误;**options是一系列关键字参数,例如methods。总的来说,route这个装饰器做的就是接收了一组参数并且调用了add_url_rule方法完成视图函数向蓝图的注册。我们要实现将红图的route代替蓝图的route,就需要在我们的Redprint里需要把我们的视图函数注册到蓝图里去,因为要传参f嘛,实现形式我们通过模仿蓝图得到:

class Redprint:def __init__(self, name):self.name = nameself.mound = []  # 把参数记录下来passdef route(self, endpoint, f, **options):def decorator(f):self.mound.append((f, rule, options))  # self是蓝图对象,以元组形式添加到列表中return freturn decoratordef register(self)pass

在蓝图的路由装饰器里,实例方法调用了本身的蓝图对象,我们红图里面又如何拿到蓝图对象呢?我们的思路是先把参数记录下来,在后面的代码编写里,总会有一个地方是可以遇到蓝图对象的。我们把这个记录存储在self.mound列表中,我们要添加到的列表中的元素有三个f、rule和options,这里用元组来概括它们。还有一点,这里self.mound为什么是列表呢,因为我们不仅仅需要保存一个视图函数的信息。

接着我们自己来实现红图的register方法:

def register(self, bp, url_prefix=None):if url_prefix is None:url_prefix = ‘/’ + self.namefor f, rule, options in self.mound:  # 将每个元组里的元素进行序列解包endpoint = options.pop(“endpoint”, f.__name__)bp.add_url_rule(url_prefix + rule, endpoint, f, **options) 

该方法代替源代码中蓝图对象调用add_url_rule的注册方法。这里第一个参数是蓝图对象,第二个参数是url前缀,默认为None,在这个方法的中,我们能够得到蓝图对象,那么我们就可以在register方法里实现route装饰器的注册过程了。现在我们可以大胆放心的按照源码里的路由书写了。

options是一个字典,字典的pop()方法是取到某一个值并把原来字典里的值删除, f.__name__为它的默认值,因为options里并不一定有一个名为endpoint的键的值,当有endpoint时取endpoint的值,如果没有,取该函数的名字作为endpoint的名。

简化url结构

在下述app/api/v1/__init__.py定义蓝图bp_v1的这里,url_prefix显得颇为冗长。

from app.api.v1 import user, bookdef create_blueprint_v1():bp_v1 = Blueprint(‘v1’,__name__)user.api.register(bp_v1, url_prefix=’/user’) book.api.register(bp_v1, url_prefix=’/book’)return bp_v1

我们注册的红图对象名跟前缀名相同,我们决定把这两者结合一下以达到简洁的目的。在注册路由的方法里内部添加一个条件判断:

if url_prefix is None:url_prefix = ‘/’ + self.name

这样就可以去掉注册蓝图的url_prefix了。

Flask中自定义红图拆分视图函数的方法以及——为什么蓝图不适合用于拆分试图函数相关推荐

  1. flask中的可拨插视图

    2019独角兽企业重金招聘Python工程师标准>>> flask中的可拨插视图主要是为了代码的复用. 可拨插视图其实是一个类,需要继承flask.views.View类,必须实现d ...

  2. python类定义中、对象字符串的特殊方法是_python中自定义类对象json字符串化的方法_python json转字符串、...

    python中自定义类对象json字符串化的方法 1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): prin ...

  3. 在QT中自定义头文件和源文件的使用方法

    在QT中自定义头文件和源文件的使用方法 最近想用QT来实现一个简单的功能,为了便于函数的集成需要将功能函数进行封装,自己补了些c++的函数封装方法,发现在QT中还不太一样.接来下简单介绍一下具体怎么实 ...

  4. matlab中画的图导出高分辨率图片的方法

    论文投稿时要求分辨率要300dpi,在 matlab 中画的图导出300dpi图片的方法如下: 如何画图我就不介绍了,假设已经把图画出来了,如下图所示: 直接保存或者另存为图片的分辨率很低,因此要这么 ...

  5. vue中后端返回图片流,前端渲染方法

    vue中后端返回图片流,前端渲染方法 前端登录经常用到图形验证码,后端接口返回的是图片数据流,如下图返回图片流这样 效果图如下: 首先封装接口api和uuid[就是一个随机数,防止重复] //获取图形 ...

  6. 《C语言初阶进阶完整教程》- 已完结 - qsort函数使用方法+(数组,结构体,手动实现函数)

    目录 前言 一.解释qsort函数 1.函数原型 2.深度解析comper比较函数 二.函数使用 1.int 2.结构体 三.手动实现函数 2.核心代码(两段) 四.升级使用方法 前言 提示:此文章可 ...

  7. matlab中fminunc函数使用方法,关于Matlab:了解fminunc参数和匿名函数,函数处理程序...

    请多多包涵. 问题在最后. 我试图弄清楚如何调用fminunc的区别. 这个问题来自于Andrew Ng在Coursera机器学习课程中的第3周材料. 我正在摆脱这个问题. Matlab:Andrew ...

  8. MySQL遭遇一直处于启动中,右下角图标变黄的解决方法

    发现Spring boot的接口访问不了,返回500错误,仔细一看错误是无法连接到数据库. 于是去查看数据库的问题,发现Mysql服务一直显示正在启动,右下角图标为黄色报警: 这是正常状态,出问题时显 ...

  9. Nisus Writer Pro for Mac拆分视图和注释技巧

    Nisus Writer Pro for Mac适用于Mac操作系统的强大文字处理工具,快速,干净,具有您所需的全部功能.新版本添加了许多其他选项来控制音符的显示,功能十分不错,下面让小编为大家讲解一 ...

  10. Flask模板中可以直接访问的特殊变量和方法

    Flask中的特殊变量和方法 在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的. config 对象: config 对象就是Flask的config对象,也就是 app.confi ...

最新文章

  1. golang time.After 超时使用理解
  2. react路由守卫+重定向_React + Apollo:如何在重新查询后进行重定向
  3. java计算器如何实现运算_用java编写了一个模拟计算器的界面设计,怎么实现运算功能呢...
  4. 特征工程系列学习(零)引言
  5. centos下MySQL Workbench连接时崩溃的解决方法
  6. python爬虫案例——csdn数据采集
  7. textbox内容转为字符串_【公告】整改文章内容
  8. CSS规范(OOCSS SMACSS BEM)
  9. 论文笔记_S2D.13-2017-3DV-稀疏不变的卷积神经网络(Sparsity Invariant CNNs)
  10. 江苏计算机二级c语言考试内容,江苏省计算机等级考试二级C语言考试大纲_复习提纲.doc...
  11. VTN联合GWI共同启动“全球健康登月计划”让更多人享受到健康新生活
  12. 上海大学计算机专业就业薪资,人均月薪过万?985、211、普通大学毕业生薪资水平大起底!和你想的不一样……...
  13. android瀑布流插件,jQuery瀑布流插件 Masonry
  14. SpringBoot关闭druid的页面和添加密码验证
  15. 计算机专业综合素质试题答案,综合素质试题
  16. java字面量和符号引用
  17. 取消UOS双系统开机启动
  18. 解放拖动屏幕的双手——用xrandr配置多屏显示
  19. 关于石英晶体谐振器可靠性分析
  20. Golang 必知必会Go Mod命令

热门文章

  1. 华为三层交换机路由配置案例_华为三层交换与路由配置
  2. 华为服务器修改snmp用户,华为S5700交换机Telnet、SSH、SNMP基础远程管理配置
  3. 华为社招机考考什么_华为机考一般考什么
  4. 升级到Chipmunk(2021.2.1)版本 遇到Run按钮不可用
  5. Android移动开发基础
  6. 潇洒郎:批量压缩大师——python实现文件批量命名+批量加密码——GUI软件——打包exe文件
  7. 全线路IC闭环控制自动温控电热毯维修记
  8. 网络原理考点之无线网络应用层协议
  9. 基于32feet.net对Broadcom(Widcomm)
  10. 【2016】【论文笔记】差频可调谐THz技术——