定义
简单来说,Blueprint 是一个存储视图方法的容器,这些操作在这个Blueprint 被注册到一个app之后就可以被调用,Flask 可以通过Blueprint来组织URL以及处理请求。
在其他地方,这个概念可能叫组路由
功能
蓝图的功能:主要是将大型项目分层解耦,模块化
- 可以将相同模块的视图函数放在同一蓝图下,同一个文件中,方便管理。
- 应用URL前缀和子域名在一个蓝图上
- 应用不同的URL规则多次注册一个蓝图
- 通过蓝图提供模板过滤器、静态文件、模板和其它功能。(一个蓝图不一定要实现应用或者视图函数)
- 初始化一个Flask扩展时,在这些情况中注册蓝图
基本语法
- 导入蓝图
- 定义蓝图
- 注册蓝图
示例代码:
# blueprints/user.py
from flask import Blueprint
# 1. 初始化蓝图
user_bp = Blueprint('user', __name__)
# 2. 定义蓝图视图
@user_bp.route('/profile/')
def profile():
return "个人中心页面"
@user_bp.route('/settings/')
def settings():
return "个人中心设置页面"
# app.py
app = Flask(__name__)
app.register_blueprint(user_bp) # 注册蓝图
蓝图源代码
class Blueprint(_PackageBoundObject):
"""Represents a blueprint. A blueprint is an object that records
functions that will be called with the
:class:`~flask.blueprints.BlueprintSetupState` later to register functions
or other things on the main application. See :ref:`blueprints` for more
information.
.. versionadded:: 0.7
"""
warn_on_modifications = False
_got_registered_once = False
def __init__(self, name, import_name, static_folder=None,
static_url_path=None, template_folder=None,
url_prefix=None, subdomain=None, url_defaults=None,
root_path=None):
_PackageBoundObject.__init__(self, import_name, template_folder,
root_path=root_path)
self.name = name
self.url_prefix = url_prefix
self.subdomain = subdomain
self.static_folder = static_folder
self.static_url_path = static_url_path
self.deferred_functions = []
if url_defaults is None:
url_defaults = {}
self.url_values_defaults = url_defaults
# name: 蓝图名字
# import_name: 通常是__name__,指定蓝图资源文件夹
# static_folder: 指向fs中的目录,公开一个静态文件的目录(可以使用绝对路径与相对路径)
# template_folder: 公开蓝图模板目录
# subdomain: 使用蓝图实现子域名
蓝图路由前缀
蓝图可以在路由前挂载,即蓝图路由前缀,如以下url中的user前缀
domain/user/settings/
domain/user/profile/
定义方法如下(注意添加前缀时,前缀的斜杠与蓝图函数的路由斜杠问题):
# blueprints/user.py
from flask import Blueprint
# 1. 初始化蓝图
user_bp = Blueprint('user', __name__, url_prefix="/user") # 添加路由前缀
# 2. 定义蓝图
@user_bp.route('/profile/')
def profile():
return "个人中心页面"
蓝图资源文件
蓝图模板文件的查询顺序:
- 如果 templates 目录中有相应的模板文件,就直接使用
- 如果 templates 目录中没有相应的模板文件, 就去定义蓝图时指定的路径中寻找。蓝图中指定的路径可以为相对路径(相对的是当前这个蓝图文件所在的目录:
blueprint_name/templates
)
蓝图静态文件的查询顺序
- 如果使用
url_for('static')
指定了 static目录,那么只会在app指定的 static目录查找 - 如果模板文件指定蓝图的名字
url_for('news.static')
,那么就会到blueprint_name/static_folder
目录下查找
构建URLs
当你想要从一个页面链接到另一个页面,你可以像通常一个样使用 url_for()
函数,只是你要在 URL 的末端加上蓝图的名称和一个点(.
)作为前缀:
使用
url_for()
函数时,需要在endpoint 前加上所调用蓝图的名字url_for('admin.index')
即使在同一个蓝图中反转视图函数,也要指定蓝图的名字
url_for('.index')
蓝图实现子域名
使用蓝图实现子域名
- 创建蓝图时,传递
subdomain=xxxx
- 在主app文件中,需要配置
SERVER_NAME
子域名的实现也是使用Blueprint
来实现的,首先创建一个cms
文件
from flask import Blueprint
cms_bp = Blueprint('cms',__name__,subdomain='cms') # 1. 设置子域名为 cms
@cms_bp.route('/')
def cms_index():
return '我是cms的管理平台'
到/private/etc/hosts
中修改域名对应
127.0.0.1 test.com
127.0.0.1 cms.test.com
在主文件中添加蓝图和设置域名
app.register_blueprint(cms_bp)
app.config['SERVER_NAME'] = 'test.com:5000' # 2. 配置 SERVER_NAME
这样我们就能通过http://cms.test.com:5000/
访问cms.test.com
这个字域名下面的视图函数。