102

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

我正在创建一个 Web 服务,我想将 api 拆分为不同的文件(AccountAPI.py、UploadAPI.py、...),这样我就没有一个巨大的 python 文件。

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

最终,我想运行一个 Main python 文件并包含其他文件,以便在运行时将它们视为一个大文件。

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

主要.py:

from flask import Flask
import AccountAPI

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

帐户API.py:

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

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

谢谢

4

4 回答 4

173

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

主文件

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

如需更多文档,您还可以查看官方文档

于 2013-03-05T18:43:06.627 回答
49

使用您可以在目录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 *

索引.py

from flask import render_template
from . import routes

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

用户.py

from flask import render_template
from . import routes

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

应用程序.py

from routes import *
app.register_blueprint(routes)

如果你想添加一个新的路由文件,比如accounts.py,你只需要accounts.pyroutes目录中创建文件,就像index.pyand一样users.py,然后在routes.__init__.py文件中导入

from .accounts import *
于 2016-04-17T15:57:25.527 回答
3

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

在您的情况下,如果您想打开蓝图的 url 帐户,您必须在模板中这样声明:

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

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

redirect(url_for('account_api.account'))

否则 werkzeug 库会抛出错误。

于 2014-03-16T01:24:54.927 回答
1

另一种方法是延迟加载,您可以根据需要显式附加视图功能。

于 2013-09-17T23:54:32.337 回答