Flask之项目设计(5)

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 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值