将Python Flask应用分割成多个文件

我无法理解如何将烧瓶应用程序拆分为多个文件。

我正在创build一个Web服务,我想将API分成不同的文件(AccountAPI.py,UploadAPI.py,…),所以我没有一个巨大的Python文件。

我已经读过,你可以用蓝图来做这件事,但我并不完全确定这条路线对我来说是正确的。

最终,我想运行一个主要的Python文件,并包含其他文件,以便在运行时,它们被认为是一个大文件。

例如,如果我有Main.py和AccountAPI.py我想能够做到这一点:

Main.py:

from flask import Flask import AccountAPI app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run() 

AccountAPI.py:

 @app.route("/account") def accountList(): return "list of accounts" 

我知道这个例子显然是行不通的,但是可以这样做吗?

谢谢

是的,蓝图是正确的做法。 你正在做的事情可以这样实现:

Main.py

 from flask import Flask from AccountAPI import account_api app = Flask(__name__) app.register_blueprint(account_api) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run() 

AccountAPI.py

 from flask import Blueprint account_api = Blueprint('account_api', __name__) @account_api.route("/account") def accountList(): return "list of accounts" 

如果这是一个选项,你可能会考虑使用不同的API前缀/不同的API /蓝图,以清楚地分离它们。 这可以通过稍微修改上面的register_blueprint调用来完成:

 app.register_blueprint(account_api, url_prefix='/accounts') 

有关进一步的文件,你也可以看看官方文件 。

使用Blueprint您可以在routes目录中添加routes

结构体

 app.py routes __init__.py index.py users.py 

__init__.py

 from flask import Blueprint routes = Blueprint('routes', __name__) from .index import * from .users import * 

index.py

 from flask import render_template from . import routes @routes.route('/') def index(): return render_template('index.html') 

users.py

 from flask import render_template from . import routes @routes.route('/users') def users(): return render_template('users.html') 

app.py

 from routes import * app.register_blueprint(routes) 

如果你想添加一个新的路由文件,比如说accounts.py ,你只需要在routes目录中创build文件accounts.py ,就像index.pyusers.py ,然后将其导入到routes.__init__.py文件

 from .accounts import * 

如果您正在使用蓝图,并且希望将路线/redirect到您正在使用的模板内的蓝图的url,则需要使用正确的url_for语句。

在你的情况下,如果你想打开你的蓝图的url帐户,你必须在你的模板中这样说

 href="{{ url_for('account_api.account') }}" 

而对于主应用程序 ,它将看起来像这样:

 redirect(url_for('account_api.account')) 

否则werkzeug库会抛出一个错误。

另一种方法是使用延迟加载 ,在这种情况下,您可以根据需要显式附加视图函数。