1 包结构设计
我们可以把应用程序中不同的组件分解成有联系的模块 — 一个包。
模型的定义类一起放入 models.py,路由的定义放在 views.py 以及表单定义在 forms.py
常用包结构设计如下:
config.py #应用所需要的配置变量。
requirements.txt
run.py
instance/
config.py #包含了不应该出现在版本控制中的配置变量。 这个文件包含像 API 密钥以及包含密码的数据库 URIs。 这个文件也包含了针对于你的应用程序特定实例的变量。 例如,你可能在 config.py 中设置了 DEBUG = False。 但是为了开发在你本地的机器的 instance/config.py 中设置了 DEBUG = True。因为这个文件会在 config.py 后被读取, 它将会覆盖 config.py 中的配置变量,设置 DEBUG = True。
app/
__init__.py #这个文件来初始化你的应用程序,并汇集了所有的各种组件。
views/home_view.py #这是路由定义所在的文件
models.py #用程序模型定义的所在的文件。 它能够像上面视图一样分成几个模块。
forms.py
static/ #这个目录包含公共的 CSS,JavaScript,图片以及其它文件。 默认情况下可以从 app.com/static/ 中访问到。
templates/ # Jinja2 模板所在的目录
2 蓝图设计
2.1什么是蓝图
在某些时候我们可能有许多不同种类的路由。我们需要考虑到将这些不同的路由分割成多种view.py文件并放到各种不同的模块下面时,这个时候就要将应用分解成蓝图。
- 蓝图本质上就是以某种独立的方式定义的应用程序的组件。我们可能针对管理面板,前端以及用户控制面板有着不同的蓝图。这会让你依据组件分组视图,静态文件以及模板,同时会让你在这些组件之间共享你的应用程序的模型,表单以及其它方面。
- 一个蓝图定义了视图,模板,静态文件以及可以用于应用程序的其它元素的集合。例如,让我们假设下我们有一个管理面板的蓝图。这个蓝图会定义一些包含像 /admin/login 和 /admin/dashboard 路由的视图。它也可能包含服务于这些路由的模板以及静态文件。接着我们可以使用这个蓝图添加一个管理面板到我们的应用程序中,不论我们的应用程序是什么类型的。
- 蓝图“杀手级”使用场景就是把我们的应用程序组织成不同的组件。
2.2蓝图项目结构
项目结构
使用蓝图组织我们的应用程序有很多的方式。通常情况下,我们可以考虑按功能结构和分区这两种选择。
- 功能结构
按照功能结构的话,你可以通过它们所做的事情来组织你的应用程序的结构。模板在一个文件夹中,静态文件在另一个文件夹中,视图在第三个文件夹中。
app/
__init__.py
static/
templates/
home/
control_panel/
admin/
views/
__init__.py
home.py
control_panel.py
admin.py
models.py
除了 app/views/init.py,在上面列表中的 yourapp/views/ 文件夹中的每一个 .py 文件都是一个蓝图。在 yourapp/init.py 中我们要导入这些蓝图并且在我们的 Flask() 对象中 注册 它们。
Flask 站点:http://flask.pocoo.org 使用的就是这种结构。可以到 GitHub 上查看项目结构。
- 分区
对于分区结构了,你可以基于它们有助于应用程序的哪一部分来组织应用程序的结构。管理面板所有的模板,视图以及静态文件都在一个文件夹中,用户控制的所有的模板,视图和静态文件在另一个文件夹中。
app/
__init__.py
admin/
__init__.py
views.py
static/
templates/
home/
__init__.py
views.py
static/style.css
templates/
control_panel/
__init__.py
views.py
static/
templates/
models.py
像上面列出的应用程序的分区结构,在 app/ 中每一个文件夹都是一个单独的蓝图。所有的这些蓝图都会应用到顶层 init.py 中的 Flask() 对象中。
- 如何选择项目结构:
应用程序大部分是独立的结构,仅仅共享着像模型和配置,分区结构就是合适的选择方式。
如果应用程序联系地更加紧密一些的话,它可能用一个功能结构呈现更加合适。
2.3 使用蓝图
本项目结构:
config.py #应用所需要的配置变量。
requirements.txt
run.py
instance/
config.py
app/
__init__.py #这个文件来初始化你的应用程序,并汇集了所有的各种组件。
views/case_view.py #这是路由定义所在的文件
models.py #用程序模型定义的所在的文件。 它能够像上面视图一样分成几个模块。
forms.py
static/ #这个目录包含公共的 CSS,JavaScript,图片以及其它文件。 默认情况下可以从 app.com/static/ 中访问到。
templates/ # Jinja2 模板所在的目录
使用步骤
(1) 蓝图资源目录
蓝图有自己的目录,它的所有资源都在其目录下。蓝图的资源目录是由创建Blueprint对象时传入的模块名__name__所在的位置决定的。同时,我们可以指定蓝图自己的模板目录和静态目录。比如我们创建蓝图时传入:
admin_bp = Blueprint('admin', __name__,
template_folder='templates',
static_folder='static')
这样,该蓝图的模板目录就在”admin/templates”下,而静态目录就在”admin/static”下。当然,其实默认值就是这两个位置,不指定也没关系。我们可以用蓝图对象的root_path属性获取其主资源路径,open_resource()方法访问主资源路径下的某个文件,比如:
# Assume current app is at /home/bruce/app,
# this will return /home/bruce/app/admin
print admin_bp.root_path
# Read file /home/bruce/app/admin/files/info.txt
with admin_bp.open_resource('files/info.txt') as f:
info = f.read()
print info
(2)创建蓝图对象
- 功能结构
要创建一个蓝图对象,我们先导入 Blueprint() 类并且用参数 name 和 import_name 初始化它。通常情况下,import_name 就是 name,这是一个包含当前模块名称的特殊 Python 变量。
# app/views/case.py
from flask import Blueprint, render_template
case_page = Blueprint('case_page', __name__)
@case_page.route("/api/v1/project/<porject_id>/case/case_list")
def case_list():
return render_template('case.html')
@case_page.route("/api/v1/project/<porject_id>/case/<case_id>")
def case_info():
pass
@case_page.route("/api/v1/project/<porject_id>/case/<case_id>/update_case")
def update_case():
pass
@case_page.route("/api/v1/project/<porject_id>/case/<case_id>/create_case")
def add_case():
pass
- 分区结构
如果是按照分区结构组织,我们要通知 Flask 蓝图有自己的模板和静态文件夹。一个蓝图可以通过 static_folder 关键字参数提供一个指向文件系统上文件夹的路 径,来公开一个带有静态文件的文件夹。这可以是一个绝对路径,也可以是相对于蓝图文件夹的路径。
项目文件结构参考上面:分区结构
home = Blueprint('home', __name__,
template_folder='templates',
static_folder='static')
默认情况下,路径最右边的部分就是它在 web 上所公开的地址。因为这里这个文件夹叫做 static , 它会在蓝图 + /static 的位置上可用。也就是说,蓝图为 /admin 把静态文件夹注册到 /admin/static 。
最后是命名的 blueprint_name.static