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

时间:2013-03-05 18:29:14

标签: python web-services file-organization 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"

我知道这个例子显然不起作用,但有可能做那样的事吗?

由于

4 个答案:

答案 0 :(得分:116)

是的,蓝图是正确的方法。你想要做的就是这样:

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

有关进一步的文档,您还可以查看the official docs

答案 1 :(得分:26)

使用Blueprint,您可以在routes目录中添加路线。

结构

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

__初始化__。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.py目录中创建文件routes,就像index.py和{ {1}},然后将其导入users.py文件

routes.__init__.py

答案 2 :(得分:3)

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

在您的情况下,如果您想打开蓝图的网址帐户,则必须在模板中说明这一点:

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

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

redirect(url_for('account_api.account'))

否则werkzeug库会抛出错误。

答案 3 :(得分:1)

执行此操作的另一种方法可以是lazy loading,您可以根据需要明确附加视图函数。