大型应用程序作为包¶
设想一个简单的 Flask 应用程序结构,如下所示
/yourapplication
yourapplication.py
/static
style.css
/templates
layout.html
index.html
login.html
...
虽然这对于小型应用程序来说很好,但对于大型应用程序,最好使用包而不是模块。教程的结构是使用包模式,请参阅示例代码。
简单包¶
要将其转换为较大的包,只需在现有包内创建一个新文件夹 yourapplication
并将所有内容移动到其下方。然后将 yourapplication.py
重命名为 __init__.py
。(确保首先删除所有 .pyc
文件,否则很可能会中断)
然后你应该得到类似这样的东西
/yourapplication
/yourapplication
__init__.py
/static
style.css
/templates
layout.html
index.html
login.html
...
但你现在如何运行你的应用程序?幼稚的 python yourapplication/__init__.py
将不起作用。我们只能说 Python 不希望包中的模块成为启动文件。但这并不是什么大问题,只需在内部 yourapplication
文件夹旁边添加一个名为 pyproject.toml
的新文件,其中包含以下内容
[project]
name = "yourapplication"
dependencies = [
"flask",
]
[build-system]
requires = ["flit_core<4"]
build-backend = "flit_core.buildapi"
安装你的应用程序,以便可以导入
$ pip install -e .
要使用 flask
命令并运行你的应用程序,你需要设置 --app
选项,该选项告诉 Flask 在哪里找到应用程序实例
$ flask --app yourapplication run
我们从中得到了什么?现在我们可以将应用程序重构为多个模块。您只需记住以下快速清单
Flask 应用程序对象创建必须在
__init__.py
文件中。这样每个模块都可以安全地导入它,并且 __name__ 变量将解析为正确的包。所有视图函数(顶部带有
route()
装饰器的函数)都必须在__init__.py
文件中导入。不是对象本身,而是它所在的模块。在创建应用程序对象后导入视图模块。
以下是一个 __init__.py
示例
from flask import Flask
app = Flask(__name__)
import yourapplication.views
而 views.py
将如下所示
from yourapplication import app
@app.route('/')
def index():
return 'Hello World!'
然后你应该得到类似这样的东西
/yourapplication
pyproject.toml
/yourapplication
__init__.py
views.py
/static
style.css
/templates
layout.html
index.html
login.html
...
循环导入
每个 Python 程序员都讨厌它们,但我们刚刚添加了一些:循环导入(即当两个模块相互依赖时。在这种情况下,views.py
依赖于 __init__.py
)。请注意,这通常是一个坏主意,但在这里实际上是可以的。原因是我们实际上并没有在 __init__.py
中使用视图,只是确保导入模块,并且我们在文件的底部执行此操作。
使用蓝图¶
如果您有较大的应用程序,建议将它们分成较小的组,其中每个组都在蓝图的帮助下实现。有关此主题的简单介绍,请参阅文档的 使用蓝图构建模块化应用程序 章节。