大型应用作为包

想象一下一个简单的 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

我们从中获得了什么? 现在我们可以将应用程序稍微重组为多个模块。 你唯一需要记住的是以下快速清单

  1. Flask 应用对象的创建必须在 __init__.py 文件中。 这样,每个模块都可以安全地导入它,并且 __name__ 变量将解析为正确的包。

  2. 所有视图函数(顶部带有 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 中使用视图,而只是确保模块被导入,并且我们在文件底部执行此操作。

使用蓝图

如果你的应用程序较大,建议将其划分为更小的组,其中每个组都在蓝图的帮助下实现。 有关此主题的温和介绍,请参阅文档的《使用蓝图的模块化应用程序》章节。