基于 Flask 蓝图(Blueprint)的子应用开发

发布于 2020-11-15 11:57:37 字数 3341 浏览 1339 评论 0

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.pyBUILTIN_BLUEPRINTS 时,加入的字符串格式为 Blueprint 对象的“命名空间:变量名”,例如 "sigmago.sky:app"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文