将Python Flask应用拆分为多个文件


88

我在理解如何将Flask应用程序拆分为多个文件时遇到麻烦。

我正在创建一个Web服务,并且想将api拆分为不同的文件(AccountAPI.py,UploadAPI.py等),只是我没有一个巨大的python文件。

我读过您可以使用“蓝图”来做到这一点,但我不确定这条路线是否适合我。

最终,我想运行一个Main 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"

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

谢谢

Answers:


158

是的,蓝图是实现此目标的正确方法。您正在尝试做的事情可以这样实现:

主程序

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 /蓝图使用不同的URL前缀,以便将它们完全分开。可以对上面的register_blueprint调用稍作修改即可完成此操作:

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

有关更多文档,您还可以查看官方文档


这对我来说效果很好,谢谢!我想我应该更仔细地阅读Blueprint文档。
user1751547 2013年

嘿,我有一个问题。在下面的上述代码中,accountList()的URL是否与“域/帐户/帐户”匹配?
jeyraof

4
Main.py和AccountAPI.py可以在两个文件中都有一个共享的全局变量吗?
matchifang '17

是否有一个简单的解决方案将accountList一个类放入同一文件?
GA1

像魅力一样工作,进一步介绍了如何在单独的.py文件中使用JWT添加受保护的端点
Ashok Sri,

41

使用,Blueprint您可以将路径添加到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,只需accounts.pyroutes目录中创建文件,就像index.py和一样users.py,然后将其导入routes.__init__.py文件中。

from .accounts import *

1
它引发了导入错误
Abhishek Jebaraj

在文件中间导入是否可以视为不良做法?
TomSawyer

3

如果您使用的是蓝图,并且要在模板内路由/重定向到您的蓝图的url,则需要使用正确的url_for语句。

如果您要打开蓝图的url帐户,则必须在模板中这样声明

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

对于主应用程序,它将如下所示:

redirect(url_for('account_api.account'))

否则,werkzeug库将引发错误。


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.