209

我的烧瓶应用程序当前由一个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正常工作?

4

6 回答 6

199

您可以使用通常的 Python 包结构将您的应用程序划分为多个模块,请参阅 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 文档

于 2012-08-16T20:09:37.557 回答
80

您可以使用简单的技巧,即从另一个文件中的 main 导入 flask app 变量,例如:

test_routes.py

from __main__ import app

@app.route('/test', methods=['GET'])
def test():
    return 'it works!'

并在您声明烧瓶应用程序的主文件中,导入测试路线,例如:

应用程序.py

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test_routes

它从我这边工作。

于 2019-12-03T10:36:29.110 回答
33

无需蓝图和使用集中式 URL 映射的复杂导入即可完成此任务

应用程序.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)

视图.py

from flask import render_template

def index():
    return render_template('index.html')

def other():
    return render_template('other.html')
于 2020-02-27T21:20:47.067 回答
17

我想在 GitHub 上推荐flask-empty 。

它提供了一种简单的方式来理解蓝图、多个视图和扩展

于 2012-08-16T20:52:33.263 回答
7

如果您需要拆分蓝图来分隔文件,您可以使用代码片段:

# 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'

于 2021-07-16T09:03:54.563 回答
6

将应用程序划分为蓝图是一个好主意。但是,如果这还不够,并且您想将蓝图本身划分为多个 py 文件,也可以使用常规 Python 模块导入系统,然后循环遍历从其他文件导入的所有路由.

我用代码创建了一个要点:

https://gist.github.com/Jaza/61f879f577bc9d06029e

据我所知,这是目前分割蓝图的唯一可行方法。在 Flask 中创建“子蓝图”是不可能的,尽管有很多关于这个的讨论存在一个问题:

https://github.com/mitsuhiko/flask/issues/593

此外,即使有可能(并且使用该问题线程中的一些片段可能是可行的),无论如何,子蓝图对于您的用例可能过于限制 - 例如,如果您不希望所有路线都在一个子模块具有相同的 URL 子前缀。

于 2015-02-06T04:08:02.433 回答