我的 Flask 应用程序当前由一个具有多个路由的
test.py
文件和定义的 main()
路由组成。有什么方法可以创建一个 test2.py
文件,其中包含未在 test.py
中处理的路线?
@app.route('/somepath')
def somehandler():
# Handler code here
我担心
test.py
中有太多路线,并且希望能够运行 python test.py
,它也会拾取 test.py
上的路线,就好像它是同一文件的一部分一样。我必须在 test.py
中进行哪些更改和/或包含在 test2.py
中才能使其正常工作?
您可以使用常用的 Python 包结构将您的 App 分为多个模块,请参阅 Flask 文档。
但是,
Flask 使用蓝图的概念来制作应用程序组件并支持应用程序内或跨应用程序的常见模式。
您可以在单独的文件中创建应用程序的子组件作为蓝图:
simple_page = Blueprint('simple_page', __name__, template_folder='templates')
@simple_page.route('/<page>')
def show(page):
# stuff
然后在主体部分使用它:
from yourapplication.simple_page import simple_page
app = Flask(__name__)
app.register_blueprint(simple_page)
蓝图还可以捆绑特定资源:模板或静态文件。请参阅 Flask 文档 了解所有详细信息。
您可以使用简单的技巧,即从另一个文件中的 main 导入 Flask app 变量,例如:
test_routes.py
from __main__ import app
@app.route('/test', methods=['GET'])
def test():
return 'it works!'
在您声明 Flask 应用程序的主文件中,导入测试路线,例如:
app.py
from flask import Flask, request, abort
app = Flask(__name__)
# import declared routes
import test_routes
它在我这边起作用。
使用 集中 URL 映射
,无需蓝图和棘手的导入即可完成此任务app.py
import views
from flask import Flask
app = Flask(__name__)
app.add_url_rule('/', view_func=views.index)
app.add_url_rule('/other', view_func=views.other)
if __name__ == '__main__':
app.run(debug=True, use_reloader=True)
views.py
from flask import render_template
def index():
return render_template('index.html')
def other():
return render_template('other.html')
我想在 GitHub 上推荐 flask-empty。
如果您需要拆分蓝图来分隔文件,您可以使用片段:
# app.py
from blueprint_module import blueprint
app = Flask(__name__)
app.register_blueprint(blueprint)
# blueprint_module\__init__.py
from flask import Blueprint
blueprint = Blueprint('my_blueprint', __name__)
from . import page
# blueprint_module\page.py
from . import blueprint
@blueprint.route("/url", methods=['GET'])
def hello():
return 'hello world'
将应用程序划分为蓝图是个好主意。但是,如果这还不够,并且您想将蓝图本身划分为多个 py 文件,也可以使用常规 Python 模块导入系统,然后循环遍历从其他文件导入的所有路由.
我使用执行此操作的代码创建了一个要点:
https://gist.github.com/Jaza/61f879f577bc9d06029e
据我所知,这是目前唯一可行的划分蓝图的方法。在 Flask 中创建“子蓝图”是不可能的,尽管有一个问题存在并且对此有很多讨论:
https://github.com/mitsuhiko/flask/issues/593
此外,即使这是可能的(并且可能可以使用该问题线程中的一些片段来实现),子蓝图无论如何对于您的用例来说可能限制太多 - 例如如果您不希望子模块中的所有路由都具有相同的 URL 子前缀。
解决方案非常简单。 创建一个新文件并将应用程序放入该文件中。 然后您可以将该文件导入到任何地方。 例如, 在A.py中 应用程序 = Flask(名称)
在 B.py 和 C.py 中 从 A 进口 *