一个小型的Flask应用的目录结构一般是这样的
/yourapplication
yourapplication.py
/static
style.css
/templates
layout.html
index.html
login.html
...
上面结构非常适合小型项目,但对大型项目来说,我们一般会用包来表示模块,这有个示例就是用包的形式构建的。
包结构
对更大一点的项目,我们仅仅需要在yourapplication里创建一个同名文件夹,并把所有内容移动到新的yourapplication里面。 将yourapplication.py 重命名为__init__.py。(确定此前已经删除了所有的.pyc文件,否则很可能会崩溃)
这样,新的目录结构如下:
/yourapplication
/yourapplication
__init__.py
/static
style.css
/templates
layout.html
index.html
login.html
但是application的运行与以前不同,直接执行python yourapplication/__init__.py不会起作用。这说明Python不希望把包里面的modules当做一个启动文件。我们只需要在内层的yourapplication文件夹中创建一个setup.py文件,setup.py的内容如下:
from setuptools import setup
setup(
name='yourapplication',
packages=['yourapplication'],
include_package_data=True,
install_requires=[
'flask',
],
)
为了运行application我们还需要导出一个环境变量:
$ export FLASK_APP=yourapplication
确定当前的工作目录是否在项目的文件夹下,与上面相似可以用如下命令开启开发模式:
$ export FLASK_ENV=development
执行如下命令,运行application:
$ pip install -e .
$ flask run
这样做有什么用?现在我们能够将一个application重构成多module的形式。我们只需要注意如下问题:
- 1 Flask的application对象必须在__init__.py中创建,这种方式能够让每一个module都能够引入它。
- 2 所有的view方法(在顶部有route()装饰的方法)均在__init__.py文件中被引入,__init__.py引入这些文件要在application对象创建后。
__init__.py的示例代码:
from flask import Flask
app = Flask(__name__)
import yourapplication.views
所有的view.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
循环Import
python项目中不希望出现循环Import,当刚刚我们添加了循环Import(两个module互相依赖,在示例中__init__.py和view.py互相依赖)。通常情况下这种写法很差,但在这里非常适合。原因是因为在__init__.py中我们并没有真正的去使用views,仅仅是确保modules被引入进来,并且,我们的import代码放在了__init__.py文件的底部。
使用Blueprints
如果是一个更大的项目,推荐使用Blueprints。