大型应用程序包 — Flask 文档

来自菜鸟教程
Flask/docs/2.0.x/patterns/packages
跳转至:导航、​搜索

作为包的大型应用程序

想象一个简单的flask应用程序结构,如下所示:

/yourapplication
    yourapplication.py
    /static
        style.css
    /templates
        layout.html
        index.html
        login.html
        ...

虽然这对于小型应用程序很好,但对于大型应用程序,使用包而不是模块是个好主意。 这教程被构造为使用包模式,请参阅 :gh:`示例代码 ` .

简单包

要将其转换为更大的文件夹,只需在现有文件夹内创建一个新文件夹 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 文件夹旁边添加一个名为 setup.py 的新文件,内容如下:

from setuptools import setup

setup(
    name='yourapplication',
    packages=['yourapplication'],
    include_package_data=True,
    install_requires=[
        'flask',
    ],
)

为了运行应用程序,您需要导出一个环境变量,告诉 Flask 在哪里可以找到应用程序实例:

如果您在项目目录之外,请确保提供应用程序目录的确切路径。 同样,您可以像这样打开开发功能:

为了安装和运行应用程序,您需要发出以下命令:

$ pip install -e .
$ flask 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
    setup.py
    /yourapplication
        __init__.py
        views.py
        /static
            style.css
        /templates
            layout.html
            index.html
            login.html
            ...

循环进口

每个 Python 程序员都讨厌它们,但我们只是添加了一些:循环导入(即两个模块相互依赖的时候。 在这种情况下,views.py 取决于 __init__.py)。 请注意,这通常是一个坏主意,但在这里实际上很好。 这样做的原因是我们实际上并没有使用 __init__.py 中的视图,只是确保导入模块,我们在文件底部执行此操作。

这种方法仍然存在一些问题,但如果你想使用装饰器,那就没有办法了。 查看 Becoming Big 部分以获得一些如何处理的灵感。


使用蓝图

如果您有较大的应用程序,建议将它们分成更小的组,每个组都在蓝图的帮助下实现。 有关此主题的简要介绍,请参阅文档的 带有蓝图的模块化应用程序 章节。