基于 Flask 蓝图(Blueprint)的子应用开发
Blueprint 简介
Blueprints in Flask are intended for these cases:
- Factor an application into a set of blueprints. This is ideal for larger applications; a project could instantiate an application object, initialize several extensions, and register a collection of blueprints.
- Register a blueprint on an application at a URL prefix and/or subdomain. Parameters in the URL prefix/subdomain become common view arguments (with defaults) across all view functions in the blueprint.
- Register a blueprint multiple times on an application with different URL rules.
- Provide template filters, static files, templates, and other utilities through blueprints. A blueprint does not have to implement applications or view functions.
- Register a blueprint on an application for any of these cases when initializing a Flask extension.
A blueprint in Flask is not a pluggable app because it is not actually an application -- it's a set of operations which can be registered on an application, even multiple times. Why not have multiple application objects? You can do that (see :ref:
app-dispatch
), but your applications will have separate configs and will be managed at the WSGI layer.
Blueprints instead provide separation at the Flask level, share application config, and can change an application object as necessary with being registered. The downside is that you cannot unregister a blueprint once an application was created without having to destroy the whole
引用文字来自 http://flask.pocoo.org/docs/blueprints/
直白点说 Blueprint 就是 Django 或者 web.py 中的“子应用”,每个子应用就像一个独立的 Flask 实例,可以挂载自己的视图函数、设置请求钩子、设置上下文,甚至能拥有自己的静态资源。但它不能独立运行,必须挂载在真正的 Flask 实例下。真正的 Flask 实例会像查找原型链一样将请求分发到具体的 Blueprint。
本项目蓝图用法
本项目将 Flask Application 实例的创建封装为一个叫 make_app
的工厂函数,其中包含了插件(Extension)的初始化和 Blueprint 的挂载。项目的 sigmago/config/app.py
中有一个列表变量 BUILTIN_BLUEPRINTS
,其中可以以字符串书写 Python 命名空间的方式加入需要挂载的 Blueprint。
Blueprint 的用法需要遵守一定的项目布局,这样 make_app
挂载时就可以同时自动载入所有的模块,其中一些使用装饰器或者元类载入的对象就可以被激活(例如视图函数和需要 ORM 的模型类)。
假设需要创建一个名为 sky 的 Blueprint,则目录布局应该如下(加星号的是目录):
|-- `sigmago*`
|-- |-- `sky*`
|-- |-- |-- `__init__.py` [必须]
|-- |-- |-- `views.py` [可选]
|-- |-- |-- `models.py` [可选]
|-- |-- |-- `templates*` [可选]
其中 sigmago/sky/__init__.py
是包的初始化脚本,其中需要建立两个对象。一个是 Blueprint 对象,另一个则是名为 __all__
的成员列表(或者元组)。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from flask.blueprints import Blueprint
__all__ = ("models", "views")
app = Blueprint("sky", __name__, template_folder="templates",
static_folder="static", url_prefix="/sky")
__all__
中列出的模块会在 Blueprint 被挂载前自动载入。而 Blueprint 对象建立时,第一个参数非常重要,这是 Blueprint 的名字。一般和所在的包同名。今后通过 url_for
生成 URL 时,需要通过 Blueprint 名字作为命名空间的视图函数名字。
__init__.py
中不应该导入本包中的任何模块,因为一旦发生循环倒入,将导致非常诡异的找不到模块错误。应该尽量让 __init__.py
保持简洁。
修改 sigmago/config/app.py
中 BUILTIN_BLUEPRINTS
时,加入的字符串格式为 Blueprint 对象的“命名空间:变量名”,例如 "sigmago.sky:app"
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论