如何将Flask应用划分为多个py文件?


146

我的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

Answers:


152

您可以使用常规的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文档以获取所有详细信息。


1
除了该蓝图的init之外,我们如何在文件中拥有蓝图路由?
divyenduz 2014年

如果我想使用JWT制作安全的端点,那么如何在每个route.py文件中做到这一点
Ashok Sri,


17

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

test-routes.py

from __main__ import app

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

在您的主文件中,声明flask app的位置,导入测试路由,例如:

app.py

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test-routes

它从我这边起作用。


2
只是一个例子,__main__引用您的入口文件就可以了!
nimeresam

3
太好了,非常感谢。上面的蓝图或打包方法对于小型应用程序来说是过大的杀伤力。
VH-NZZ

这是解释此方法的文档的链接:https
Christopher

5

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

我使用以下代码创建了一个Gist:

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

据我所知,这是目前划分蓝图的唯一可行方法。尽管存在很多与此相关的话题,但在Flask中无法创建“子蓝图”:

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

另外,即使有可能(并且可以使用该问题线程中的一些代码片段来实现),子蓝图对于您的用例也可能过于严格-例如,如果您不希望所有路线都在子模块具有相同的URL子前缀。


4

使用集中式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')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.