所以每个蓝图都需要告诉我的基础应用程序它想要如何
命名和它的默认路由是什么。
当您创建蓝图时,您已经在第一个参数中传递了它的名称:
simple_page = Blueprint('simple_page')
您也可以将 url_prefix 值传递给构造函数
simple_page = Blueprint('simple_page', url_prefix='/pages')
我有一个主应用程序,其中包含一些已实现的子应用程序
作为蓝图。主应用程序应该有一个导航栏
引用所有子应用程序(蓝图)
这是一个python模块中的示例,您应该将每个蓝图拆分到自己的模块中。
from flask import Flask, Blueprint, render_template
# ADMIN
admin = Blueprint('admin', __name__, url_prefix='/admin')
@admin.route('/')
def admin_index():
return 'Admin module'
@admin.route('/settings')
def settings():
return 'Admin Settings'
# USER
user = Blueprint('user', __name__, url_prefix='/user')
@user.route('/')
def user_index():
return 'User module'
@user.route('/profile')
def profile():
return 'User Profile'
app = Flask(__name__)
app.register_blueprint(admin)
app.register_blueprint(user)
@app.route('/')
def index():
return render_template('index.html', blueprints=app.blueprints)
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True, port=7000)
Jinja2 模板。请记住将此文件放在根项目的模板文件夹中,默认情况下,flask 会在该文件夹中搜索模板。
<ul>
{% for bp_name, bp in blueprints.iteritems() %}
<li><a href="{{ bp.url_prefix }}">{{ bp.name }}</a></li>
{% endfor %}
</ul>
从flask主应用程序对象,在本例中为app,您可以访问已注册的蓝图列表; app.blueprints,这是一个 Python 字典,其中包含您在构造函数中传递的蓝图的名称。因此,您将此对象传递给您的模板并在其上循环以在菜单中呈现名称和 URL。
另外,如果我想让蓝图作者通过更多
标准化方式的数据(例如,以哪种颜色显示链接到
他的作品,或者其他什么……)
由于这是特定于蓝图的数据,我认为一个好的解决方案是扩展 Blueprint 类并实现自定义方法以标准化方式保存额外数据,然后从主应用程序对象访问。
custom.py
from flask import Blueprint
class MyBlueprint(Blueprint):
bp_data = {}
def set_data(data):
# here you can make extra task like ensuring if
# a minum group of value were provided for instance
bp_data = data
admin.py
from .custom import MyBlueprint
admin = MyBlueprint('admin', __name__, url_prefix='/admin')
admin.set_data({'color': '#a569bd', 'enabled': true})
# all the blueprint's routes
...
app.py
from admin import admin
app = Flask(__name__)
app.register_blueprint(admin)
@app.route('/')
def index():
for a, b in app.blueprints:
print b.bp_data['color']
print b.bp_data['enabled']
...
当然,我的自定义蓝图类需要做更多的工作,比如验证它正在传递什么类型的数据,或者如果没有所需的值则抛出错误,例如; title、require_auth 等。从这一点开始,您必须定义蓝图必须提供给您的主应用程序才能正常工作的最低要求数据。