大型的应用¶
对于比较大型的应用,更好的做法是使用包管理代码,而不是模块来管理代码。 这非常简单。设想一个如下结构的小型应用:
/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 不希望在包中的模块成为初始运行的文件。 但这不是一个大问题,仅仅添加一个名叫setup.py
的新文件,把这个文件放在yourapplication
文件夹里,其内容如下:
from setuptools import setup
setup(
name='yourapplication',
packages=['yourapplication'],
include_package_data=True,
install_requires=[
'flask',
],
)
为了运行应用程序,您需要导出一个环境变量,告诉Flask在哪里找到应用程序实例:
export FLASK_APP=yourapplication
如果你在项目目录之外,请确保提供应用程序目录的确切路径。同样,您可以使用此环境变量打开“调试模式”:
export FLASK_DEBUG=true
为了安装和运行应用程序,您需要发出以下命令:
pip install -e .
flask run
然后,我们又能对应用做什么呢? 现在我们可以重新构造我们的应用,将其 改造为多个模块。 你唯一需要记住的就是下面的速记备忘表:
- Flask应用对象的创建必须在
__init__.py
文件里完成。这样我们就可以安全的导入每个模块,而 __name__变量将会被分配给正确的包。 - 所有(上面有
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这一章来寻找解决问题的些许灵感吧。
使用Blueprints¶
如果您有规模较大的应用,建议您将他们分拆成小的组,让每个组 接口于蓝图提供的辅助功能。 关于这一主题进一步的介绍请参考 用蓝图实现模块化的应用 这一章节的文档