Flask-Blueprint

来源:互联网 发布:java ssh linux 编辑:程序博客网 时间:2024/05/25 01:36

blueprint把不同功能的module分开。可以让应用模块化,针对大型应用。
蓝图的基本概念:在蓝图被注册到应用之后,所要执行的操作的集合。当分配请求时, Flask 会把蓝图和视图函数关联起来,并生成两个端点之前的 URL 。
比如只有一个run.py。有些功能需要多人分开来写,有些功能会有交错的可能,代码位置也不会在一起,这样可以用蓝图来开关一些模块(功能)和宏定义类似,但不是可插拔的应用而是一套可以注册在应用中的操作,并且可以注册多次。或者简单滴需要降低耦合,提高模块复用率。比如开发环境和应用环境的不同,可以用蓝图来切换环境。
蓝图的缺点是一旦应用被创建后,只有销毁整个应用对象才能注销蓝图。
下面是一个最精简的例子:

├── my_flasky     ├── app          ├── __init__.py          └── main              ├── __init__.py              └── views.py     └── manage.py==================================================================my_flasky/app/__init__.py    #encoding:utf8    from flask import Flask    def create_app():        app = Flask(__name__)        #从/main/__init__.py中获取蓝图,并注册蓝图        from .main import main as main_blueprint        app.register_blueprint(main_blueprint)        return app=================================================my_flasky/app/main/__init__.py    #encoding:utf8    from flask import Blueprint    main = Blueprint('main',__name__) #main为蓝本名称,__name__为蓝图所在的模块或者包    #切记最后再导入main文件包下的模块,以防止循环导入报错    from . import views=================================================================my_flasky/app/main/views.py    #encoding:utf8    from . import main #导入蓝图    @main.route('/')    def index():            return '<h1>我的蓝图</h1>'====================================================================my_flasky/manage.py    #encoding:utf8    from app import create_app    app = create_app()    if __name__ == '__main__':            app.run(host='0.0.0.0',port=80,debug=True)

本例实现了一个最简单的flask示例,它实现的功能和以下代码一样:

#encoding:utf8from flask import Flaskapp = Flask(__name__)def index():    return '<h1>我的蓝图</h1>'if __name__ == '__main__':    app.run()

这个确实简单的不是一丁点,但是为什么要写成上面的格式呢?
对于简单的例子或许看不出来,但是稍微复杂一点的flask应用肯定不是一个人能完成的,所以就需要分工,一人负责一块,而Blueprint就是负责组装它们的,实现模块化管理,要想学好flask这东西肯定是绕不过去的。
实现过程(以例一为例):1,在视图模块所在的包(main)内创建蓝本,并将所有的视图模块(views.py)导入;2,在存放视图模块包的目录下(app)构造create_app函数,在函数里完成蓝本的注册,可以注册多个;3,在根目录(my_flasky)中通过调用2中构造的函数创建启动脚本(manage.py)。
大概就是这样:
views.py(可以多个)—>main(可以多个)—>app(就一个)—>manage.py

1 0