将Python Flask应用拆分为多个文件
我在理解如何把一个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 个回答
如果你在使用蓝图(blueprints),并且想要在你使用的模板中跳转到蓝图里的某个网址,你需要用正确的url_for语句。
比如说,如果你想打开蓝图中的账户网址,你需要在你的模板中这样写:
href="{{ url_for('account_api.account') }}"
而对于主应用来说,它应该是这样写的:
redirect(url_for('account_api.account'))
否则,werkzeug库会报错。
使用 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.py
和 users.py
那样,然后在 routes.__init__.py
文件中导入它。
from .accounts import *
没错,使用蓝图(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')
想要了解更多信息,你也可以查看 官方文档。