大型应用程序包¶
设想一个简单的flask应用程序结构,它看起来像这样:
/yourapplication
yourapplication.py
/static
style.css
/templates
layout.html
index.html
login.html
...
对于小型应用程序来说,这很好,对于大型应用程序,最好使用包而不是模块。这个 教程 其结构是使用包模式,请参见 example code .
简单包¶
要将其转换为较大的文件夹,只需创建一个新文件夹 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不希望将包中的模块作为启动文件。但这不是一个大问题,只需添加一个名为的新文件 pyproject.toml
紧挨着内心 yourapplication
包含以下内容的文件夹:
[project]
name = "yourapplication"
dependencies = [
"flask",
]
[build-system]
requires = ["flit_core<4"]
build-backend = "flit_core.buildapi"
安装您的应用程序,使其可导入:
$ pip install -e .
要使用 flask
命令并运行您的应用程序,则需要将 --app
选项,该选项告诉FlaskTM在哪里可以找到应用程序实例:
$ flask --app yourapplication run
我们从中得到了什么?现在我们可以将应用程序稍微重组为多个模块。您只需记住以下快速检查表:
这个 Flask 应用程序对象创建必须在
__init__.py
文件。这样每个模块都可以安全地导入它, __name__ 变量将解析为正确的包。所有视图功能(带有
route()
上面的decorator)必须导入__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
只需确保模块是导入的,我们在文件的底部执行此操作。
使用蓝图¶
如果您有更大的应用程序,建议将它们分成更小的组,在这些组中,每个组都是在蓝图的帮助下实现的。有关此主题的详细介绍,请参阅 使有蓝图的模块化应用程序 文件章节。