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

115 投票
4 回答
57089 浏览
提问于 2025-04-17 18:02

我在理解如何把一个Flask应用拆分成多个文件时遇到了一些困难。

我正在创建一个网络服务,想把不同的API分到不同的文件里(比如AccountAPI.py、UploadAPI.py等),这样就不会有一个超级大的Python文件了。

我听说可以用蓝图(Blueprints)来实现这个,但我不太确定这个方法是否适合我。

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

我知道这个例子显然是行不通的,但有没有可能做到类似的事情呢?

谢谢!

4 个回答

4

如果你在使用蓝图(blueprints),并且想要在你使用的模板中跳转到蓝图里的某个网址,你需要用正确的url_for语句。

比如说,如果你想打开蓝图中的账户网址,你需要在你的模板中这样写:

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

而对于主应用来说,它应该是这样写的:

redirect(url_for('account_api.account'))

否则,werkzeug库会报错。

55

使用 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,你只需要在 routes 目录下创建一个 accounts.py 文件,就像 index.pyusers.py 那样,然后在 routes.__init__.py 文件中导入它。

from .accounts import *
192

没错,使用蓝图(Blueprints)是正确的做法。你想要实现的功能可以这样做:

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或蓝图使用不同的URL前缀,这样可以更清晰地将它们分开。只需要对上面的 register_blueprint 调用稍作修改就可以做到:

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

想要了解更多信息,你也可以查看 官方文档

撰写回答