大型应用程序包 — Flask 文档
作为包的大型应用程序
想象一个简单的flask应用程序结构,如下所示:
虽然这对于小型应用程序很好,但对于大型应用程序,使用包而不是模块是个好主意。 这教程被构造为使用包模式,请参阅 :gh:`示例代码 ` .
简单包
要将其转换为更大的文件夹,只需在现有文件夹内创建一个新文件夹 yourapplication
并将其下的所有内容移动。 然后将 yourapplication.py
重命名为 __init__.py
。 (确保先删除所有 .pyc
文件,否则很可能会崩溃)
然后你应该得到这样的结果:
但是您现在如何运行您的应用程序? 天真的 python yourapplication/__init__.py
将不起作用。 假设 Python 不希望包中的模块成为启动文件。 但这不是什么大问题,只需在内部的 yourapplication
文件夹旁边添加一个名为 setup.py
的新文件,内容如下:
为了运行应用程序,您需要导出一个环境变量,告诉 Flask 在哪里可以找到应用程序实例:
如果您在项目目录之外,请确保提供应用程序目录的确切路径。 同样,您可以像这样打开开发功能:
为了安装和运行应用程序,您需要发出以下命令:
我们从中得到了什么? 现在我们可以将应用程序稍微重组为多个模块。 您唯一需要记住的是以下快速检查清单:
- Flask 应用程序对象创建必须在
__init__.py
文件中。 这样每个模块都可以安全地导入它,并且 __name__ 变量将解析为正确的包。 - 所有视图函数(顶部带有
route()
装饰器的函数)都必须导入到__init__.py
文件中。 不是对象本身,而是它所在的模块。 创建应用对象后导入视图模块'。
下面是一个例子 __init__.py
:
这就是 views.py
的样子:
然后你应该得到这样的结果:
循环进口
每个 Python 程序员都讨厌它们,但我们只是添加了一些:循环导入(即两个模块相互依赖的时候。 在这种情况下,views.py
取决于 __init__.py
)。 请注意,这通常是一个坏主意,但在这里实际上很好。 这样做的原因是我们实际上并没有使用 __init__.py
中的视图,只是确保导入模块,我们在文件底部执行此操作。
这种方法仍然存在一些问题,但如果你想使用装饰器,那就没有办法了。 查看 Becoming Big 部分以获得一些如何处理的灵感。