大型应用程序包

设想一个简单的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不希望包中的模块成为启动文件。 但这不是一个大问题,只需在inner:file:`yourapplication`文件夹旁边添加一个名为:file:`setup.py`的新文件,其中包含以下内容:

from setuptools import setup

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

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

$ export FLASK_APP=yourapplication
> set FLASK_APP=yourapplication
> $env:FLASK_APP = "yourapplication"

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

$ export FLASK_ENV=development
> set FLASK_ENV=development
> $env:FLASK_ENV = "development"

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

$ pip install -e .
$ flask run

我们从中得到了什么?现在我们可以将应用程序稍微重组为多个模块。您只需记住以下快速检查表:

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

  2. 所有视图功能(带有 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
    setup.py
    /yourapplication
        __init__.py
        views.py
        /static
            style.css
        /templates
            layout.html
            index.html
            login.html
            ...

循环进口

每个Python程序员都讨厌它们,但我们只是添加了一些:循环导入(即当两个模块相互依赖时)。在这种情况下 views.py 取决于 __init__.py )总的来说,这是个坏主意,但在这里它实际上是好的。原因是我们实际上没有在 __init__.py 只需确保模块是导入的,我们在文件的底部执行此操作。

这种方法仍然存在一些问题,但是如果你想使用装饰师,就没有办法解决这个问题。退房 变大 这一部分是如何处理这一问题的一些启发。

使用蓝图

如果您有更大的应用程序,建议将它们分成更小的组,在这些组中,每个组都是在蓝图的帮助下实现的。有关此主题的详细介绍,请参阅 使有蓝图的模块化应用程序 文件章节。