gpt4 book ai didi

python - Flask Blueprint Initialization - 初始化一些全局变量

转载 作者:太空狗 更新时间:2023-10-30 01:33:14 25 4
gpt4 key购买 nike

我是 Flask 的新手,我正准备编写一个更大的应用程序。到目前为止,我已经将功能划分为蓝图。现在我希望能够在初始化期间从蓝图中设置一些全局变量(因此在请求上下文之外)。基本上,我想为某些蓝图自动初始化一个导航列表,因此每个蓝图都需要告诉我的基础应用程序它想要如何命名以及它的默认路线是什么。

我的目标是其他人只需将他们的自定义蓝图放入我的应用程序的“插件”文件夹即可扩展我的应用程序。在这种情况下,我的应用程序不知道它们的路由或名称。它需要在加载特定蓝图时自动学习它...

换句话说:我有一个主应用程序,其中包含一些作为蓝图实现的子应用程序。主应用程序应包含一个导航栏,引用所有子应用程序(蓝图)。蓝图如何在主菜单导航变量中注册一些东西(例如在初始化时)?

(我没有找到从蓝图中访问“self.parent”或应用程序上下文之类的方法。蓝图没有类似构造函数的东西吗?)

最佳答案

so each blueprint needs to tell my base application how it want's to be named and what it's default route is.

当您创建蓝图时,您已经在第一个参数中传递了它的名称:

simple_page = Blueprint('simple_page')

您也可以将url_prefix 值传递给构造函数

simple_page = Blueprint('simple_page', url_prefix='/pages')

I have a main application containing some sub applications implemented as blueprints. The main application should hold a navigation bar referencing to all sub applications (blueprints)

这是一个 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。

Furthermore, what if I want to enable blueprint authors to pass more data in a standardized way (e.g. in which color to display the link to his piece, or whatever...)

由于这是蓝图特定数据,我认为一个好的解决方案是扩展蓝图类并实现自定义方法以标准化方式保存额外数据,然后从主应用程序对象访问。

自定义.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

管理员.py

from .custom import MyBlueprint

admin = MyBlueprint('admin', __name__, url_prefix='/admin')
admin.set_data({'color': '#a569bd', 'enabled': true})

# all the blueprint's routes
...

应用.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 等。从现在开始,您必须定义蓝图必须提供给您的主应用程序才能正常工作的最低要求数据是什么。

关于python - Flask Blueprint Initialization - 初始化一些全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35107053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com