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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值