Flask的蓝图和红图

1、蓝图

对于简单的项目来说,比如项目就只有一个user模块,我们可以都将视图函数定义在一个文件里面,不需要用到蓝图。

但是如果我们的项目有多个模块,如下有v1模块,v2模块.....等,那么如果我们将这么多的模块的视图文件都杂在一个文件中去写的话,就会导致管理非常不便:

  如多人开发不同模块,会导致业务代码经常出现冲突,或者我们要弃用某个功能模块的话,需要去文件中找到所有的相关功能代码并一一删除......

  这样子做虽然没错,但是非常不符合pythonic的优雅,简洁的特性。

根据pythonic的特性,我们肯定希望尽可能的将代码模块化,使我们的代码看起来更加的整洁和优雅,这时候flask的Blueprint就派上用场了。

如下,我们的package api下面有两个模块,v1和v2,我们可以分别在v1和v2的__init__.py中,定义两个蓝图v1和v2,然后在v1和v2下面的文件中分别使用自定义的v1 v2两个蓝图去实现相关路由

即蓝图就是一个存储操作路由映射方法的容器,主要用来实现客户端请求和url相互关联的功能。

蓝图的实现方式如下:

 from flask import Blueprint

 def create_blueprint():

   v1 = Blueprint("v1", __name__)  # v1是自定义的蓝图的名称, __name__表示当前模块名称,此处也可以指明每个模块下面的静态文件和模板路径template_folder="", static_folder=""

   return v1

 创建完成v1蓝图后,我们需要在实例化flask核心对象app时,将其注册到flask核心对象app上

  def register_blueprint(app):

    from app.api.v1 import create_blueprint

    bp_v1 = create_blueprint()

    app.register_blueprint(bp_v1, url_prefix="/v1")  # url_prefix是给注册的蓝图添加路由前缀。

  def instance_app():

    app = Flask(__name__)

    register_blueprint(app)

    return app

 然后我们就可以在v1下面的book和user中使用我们的blueprint了。

2、红图

 蓝图主要是用于模块级别的区分,并不适用于函数级别的区分的,如下图,对于每个模块下面都有不同的视图函数,为了区分这些不同的视同函数,我们需要自定义一个和蓝图有着相同功能的模块。这里为了体现它和蓝图的异曲同工之妙,我们称之为红图(redprint)

红图(redprint)的实现:

  既然红图的功能和蓝图一样,那么红图的实现,我们自然可以参考蓝图的实现方式:

  class Redprint():

    def __init__(self, name):

      self.name=name

      self.mond = []  # 定义mond的作用在于,存储每个绑定到红图上的function,url,options等

    def route(self, url, **options):  # 参考蓝图的使用,@bp_v1.route(url, method=["GET", "POST"])

      def decorate(f):  # 装饰器的本质,就是对闭包的调用

        self.mond.append((f, url, options))

        return f

      return decorate

    def register(self, bp, url_prefix=None)

      if url_prefix is None:

        url_prefix = "/"+self.name

      for f, url, options in self.mond:

        endpoint = options.pop("endpoint", f.__name__)  # 从options关键字参数中,取出endpoint,如果没有传递endpoint参数,则使用被装饰的方法名称作为endpoint

        bp.add_url_rule(url_prefix+url, endpoint, f, **options)

红图的使用:

  在定义了红图实现类后,还是是上面的项目结构,在v1和v2包下的book和user视图函数中分别使用红图(以book为例)

  api = Redpint("book")

  @api.route("get")

  def get_book():

    return "get book"

  

  最后,需要将红图注册到蓝图上:

   在上面的创建蓝图的函数中,注册红图:

    from app.api.v1 import book, user

    def create_blueprint():

      bp_v1 = Blueprint("v1", __name__)

      book.api.register(bp_v1)

      user.api.register(bp_v1)

  这样,要在浏览器中输入ip:post/v1/book/get 即可访问v1下面的book中的get_book视图函数了

原文地址:https://www.cnblogs.com/fiona-zhong/p/10197199.html

时间: 2024-08-30 14:48:46

Flask的蓝图和红图的相关文章

flask的蓝图设计

flask的蓝图 蓝图的作用以及结构(结构的目录需要自己定义) 蓝图的作用:规范文件的目录(可以实现多个app,如admin的APP,user的APP) 比如: -proj_flask -proj_flask _admin -static -templates -__init__.py -views.py -user -static -templates -__init__.py -views.py -user.py -blog.py -__init__.py -run.py 启动文件run.p

flask框架+pygal+sqlit3搭建图形化业务数据分析平台

一. 前言 先说下主要的框架和主要的图形库的特点:(个人见解) Django:python开发的一个重量级的web框架,集成了MVC和ORM等技术,设计之初是为了使开发复杂的.数据库驱动的网站变得简单,然而由于种种原因很少有企业用来开发大型网站,而是拿来做运维开发的很多.其注重组件的重用性和"可插拔性". Flask:python开发的一个轻量级的web框架,它使用简单的核心,用 extension 增加其他功能,扩增的弹性很好,并且上手比较容易. Echars:百度开源的一个图像库,

flask多蓝图模板目录冲突解决

一.环境 Flask==0.10.1 Werkzeug==0.10.4 Jinja2==2.8 二.问题 1.蓝图架构 --app |-user |-static |-templates |-index.html |-views.py |-__init_.py |-box |-static |-templates |-index.html |-views.py |-__init_.py |-__init__.py 2.问题重现 user和box是两个蓝图,全部注册在app项目中 如果在user的

Flask blueprint蓝图按功能模块化架构实例

使用flask作为开发框架,一定要按功能模块化,否则到了后面项目越大,开发速度就越慢. 1.Flask模块化结构规划 [[email protected] yangyun]# tree . ├── asset               #资产功能目录 │   ├── __init__.py │   ├── models.py        #资产数据库结构文件 │   └── views.py         #资产视图文件 ├── user                #用户功能目录 │ 

【Flask】蓝图

蓝图应用 在Flask中的蓝图 blueprint其实本质上就是将应用解耦,不同的应用分别放在不同的文件内 蓝图一 from flask import Blueprint,render_template user = Blueprint("user",__name__,template_folder="tmp") # 参数user表示蓝图唯一标识不能重复,实例化一个蓝图(Blueprint)对象 @user.route("/user",metho

IT之路(1):flask之蓝图

flask蓝图设计基于可以按照功能划分,或者模块划分以实现代码的解构,便于管理及维护. 项目解构主要分为: application ---apps -- 项目的主要模块,模块内置数据库文件models.py,视图文件views.py,模板文件夹templates(前后端不分离) ---settings -- flask的项目配置信息 ---static -- 静态文件 ---utils -- 工具函数 ---lib -- 第三方库 docs -- 文件 logs -- 日志 manage.py

flask之蓝图系统

蓝图 对程序进行目录结构划分 不使用蓝图,自己分文件 目录结构: -templates -views -__init__.py -user.py -order.py -app.py app.py from views import app if __name__ == '__main__': app.run() init.py from flask import Flask,request app = Flask(__name__) #不导入这个不行 from . import account

flask的蓝图

蓝图 文件目录实现 app就是 flask的主入口 (比如做一个排插 3个插孔) 蓝图就是(转接排插,让更多的插头可以插到app排插上)  把蓝图比做开发页面模块 放页面代码 视图函数.模版.静态文件 (就是电器) book.py视图(电器) app.py 代码(排插) 原文地址:https://www.cnblogs.com/kaibindirver/p/12631608.html

flask的蓝图(blueprint)

第一步 第二步 第三步 第四步 原文地址:https://www.cnblogs.com/lilied/p/8424137.html