flask四、进阶蓝图(Blueprints)项目模块化

Flask 进阶蓝图(Blueprints)项目模块化

蓝图(Blueprints)

​ Flask使用蓝图的概念来制作应用程序组件,并支持应用程序或应用程序中的通用模式。蓝图可以大大简化大型应用程序的工作方式,并为Flask扩展程序在应用程序上注册操作提供了一个重要手段。Blueprint对象与Flask应用程序对象的工作方式类似,但实际上并不是应用程序,相反,它的构建或扩展应用程序的蓝图。

为什么需要使用蓝图呢
蓝图优点:

  • 将应用程序分解为一组蓝图,这对于更大的应用是更好的。一个项目可以实例化一个应用程序对象,初始化多个扩展,并注册一组蓝图。
  • 在URL前缀的应用程序上注册蓝图,URL前缀的参数将成为蓝图中所有视图函数的常见视图参数。
  • 在具有不同URL规则的应用程序中多次注册蓝图。
  • 通过蓝图提供模版过滤器,静态文件,模版和其他实用程序。蓝图不必实现应用程序或查看功能。
  • 在初始化Flask扩展时,在应用程序中注册这些蓝图。

Flask中的蓝图不是可插拔的应用程序,因为它实际上并不是一个应用程序 - 它是一组可以在应用程序中注册的操作集,甚至可以多次执行。

Blueprints仅在Flask级别提供分离,共享应用程序配置,并可根据需要在注册时更改应用程序对象。缺点是一旦创建应用程序就无法取消注册蓝图,而需要取消就只有销毁整个应用程序对象。

简单的说,蓝图记录了应用程序执行注册后的操作。Flask在调度请求时,将一个端点到另一个端点的URL视图函数与蓝图进行关联起来。

将项目模块化

首先我们先将项目的骨架搭建起来。

[tianjun@localhost Flask_TTC]$ tree
.
├── App    # App应用程序 Flask对象
│   ├── Admin  # 分块的Admin模块, 后台模块
│   │   ├── __init__.py  # Admin模块初始化文件,创建admin蓝图对象
│   │   ├── models.py  # 数据库模型文件
│   │   └── views.py  # 逻辑控制文件
│   ├── Index  # 分块的Index模块, 前台模块
│   │   ├── __init__py  # Index模块初始文件,创建index蓝图对象
│   │   ├── models.py  # 数据库模型文件
│   │   └── views.py  # 逻辑控制文件
│   └── __init__.py  # App模块初始化文件,主要对db和app创建的方法
├── config.py  # 项目配置文件
├── manager.py  # 项目启动文件
├── static  # 静态文件
├── templates  # 模板文件
├── test  # 测试文件放置位置
└── utils  # 工具文件
    ├── functions.py
    └── __init__.py

5 directories, 11 files

先对配置文件进编写

config.py

import os

BASE_DIR = os.getcwd()  # 项目的绝对路径 

TEMPLATES_DIR = os.path.join(BASE_DIR, 'templates')  # 模板文件的路径

STATICFILES_DIR = os.path.join(BASE_DIR, 'static')  # 静态文件的路径

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@localhost:3306/ttc'  # 数据库URI

SQLALCHEMY_TRACK_MODIFICATIONS = False  # 查询跟踪,不太需要,False,不占用额外的内存

然后在App模块中的__init__.py文件中编写对Flask对象进行创建的方法,初始化SQLAlchemy对象

App/__init__.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

from config import SQLALCHEMY_DATABASE_URI, SQLALCHEMY_TRACK_MODIFICATIONS

db = SQLAlchemy()  # 初始化SQLAlchemy

def create_app():
    """ 创建app的方法 """
    app = Flask(__name__)  # 生成Flask对象
    app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI  # 配置app的URI
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = SQLALCHEMY_TRACK_MODIFICATIONS
    db.init_app(app=app)  # SQLAlchemy初始化App
    # 在这还可以设置好配置后, 初始化其他的模块

    return app  # 返回Flask对象app 

接着在Index模块中创建蓝图

App/Index/__init__.py

from flask import Blueprint

from config import TEMPLATES_DIR, STATICFILES_DIR

index = Blueprint('index', __name__, 
                  template_folder=TEMPLATES_DIR,
                 static_folder=STATICFILES_DIR)  # 创建一个蓝图对象,设置别名,模板文件地址,静态文件地址

from App.Index import views  # 这里导入是为了在解释时,蓝图能加载到views文件中的路由数据

再接着在views.py中为蓝图设置路由

from App.Index import index  # 获取蓝图

from App.Index.models import *  # 获取数据库模型对象和SQLAlchemy对象db,注意不可使用App模块中的db

@index.route('/')  # 设置路由
def index():  # 执行的方法
    return 'This Page Is Index'

(Admin模块蓝图的创建方法和上述过程相似不做过多描述)

最后在manager.py文件中对蓝图进行注册

from flask_script import Manager

from App import create_app
from App.Index import index
from App.Admin import admin

app = create_app()  # 创建app
app.register_blueprint(index, url_prefix='/index')  # 注册蓝图
app.register_blueprint(admin, url_prefix='/admin')  # 注册蓝图

manager = Manager(app)  # 通过app创建manager对象

if __name__ == '__mian__':
    manager.run()  # 运行服务器

注意

在这里一定要严格在遵守Python导入包的编写顺序

  1. Python Build In 内构包
  2. Python 第三方库
  3. 用户自定义模块

好了配置为完成,运行服务器

(venv) [tianjun@localhost Flask_TTC]$ python manager.py runserver -h 127.0.0.1 -p 5000 -d
 * Serving Flask app "App" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 244-604-680

访问页面


这里写图片描述

参考文档

Flask Blueprints

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,182评论 22 257
  • flask是python的一个web应用框架,django很多人听过,flask比较少见,连创始人一开始写出来只是...
    思而忧阅读 2,942评论 0 5
  • 1,蓝图定义: Flask 用 蓝图(blueprints) 的概念来在一个应用中或跨应用制作应用组件和支持通用的...
    晓可加油阅读 831评论 0 0
  • 什么是蓝图? 一个蓝图定义了视图,模板,静态文件以及可以用于应用程序的其它元素的集合。例如,让我们假设下我们有一个...
    邪恶的Sheldon阅读 1,232评论 0 1
  • 在合理的时间干完车 之后把卫生区从新都打扫了下 看着也就舒服多了
    呵呵_206a阅读 80评论 0 0