我无法理解如何将烧瓶应用分成多个文件。
我正在创建一个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"
我知道这个例子显然不起作用,但有可能做那样的事吗?
由于
答案 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
from flask import Blueprint
routes = Blueprint('routes', __name__)
from .index import *
from .users import *
from flask import render_template
from . import routes
@routes.route('/')
def index():
return render_template('index.html')
from flask import render_template
from . import routes
@routes.route('/users')
def users():
return render_template('users.html')
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,您可以根据需要明确附加视图函数。