Flask 蓝图路由的模块化开发

基于 Flask 蓝图路由的模块化开发

1. 编程目标

为了提高Flask应用的可维护性和可扩展性,我们通过使用Flask的蓝图(Blueprint)功能,可以将不同的功能模块拆分到独立的文件中,方便后续的开发和维护。

2. 项目结构

项目结构树如下:

flask_project/
├── app.py  # 包含应用实例(如果是app包那么还包含配置文件)
├── controller/  # 包含所有的控制器(即路由处理模块)
│   ├── __init__.py
│   ├── user_controller.py
│   ├── article_controller.py
│   ├── comment_controller.py
├── tests/  # 测试脚本
│   ├── test_user.py
│   ├── test_article.py
│   ├── test_comment.py
├── requirements.txt  # 依赖包

3. 蓝图(Blueprint)

3.1 什么是蓝图(Blueprint)

蓝图(Blueprint)是Flask提供的一个功能,用于将应用的不同部分模块化。我们通过将不同的功能模块放在单独的蓝图中,我们可以更好地组织代码,提高代码的可维护性。

3.2 蓝图解决的问题

在我们的一个项目里头,如果所有的路由都写在一个文件中,会导致代码冗长且难以维护。
通过蓝图,可以将相关的路由和逻辑拆分到不同的模块中,使代码结构清晰,易于管理和维护。

3.3 蓝图的基本使用方法

蓝图的使用主要包括以下几个步骤:

  1. 创建蓝图实例

    from flask import Blueprint
    user_bp = Blueprint('user', __name__)
    
  2. 定义路由

    @user_bp.route('/add_user')
    def add_user():
        return "添加用户成功"
    
  3. 注册蓝图

    from flask import Flask
    app = Flask(__name__)
    app.register_blueprint(user_bp, url_prefix='/user')
    

通过这种方式,我们可以将不同功能的路由分开到不同的模块中,避免将所有路由写在一个文件中出现混乱、难以管理和维护的情况。

4. 实践示例:基于蓝图的模块化开发

4.1 用户管理模块

4.1.1 创建用户蓝图

controller文件夹下创建user_controller.py文件,并定义用户相关的蓝图和路由:

# -*- coding: utf-8 -*-
from flask import Blueprint

user_bp = Blueprint('user', __name__)


@user_bp.route('/add', methods=['POST'])
def add_user():
    return "添加用户成功"


@user_bp.route('/update', methods=['POST'])
def update_user():
    return "更新用户成功"

4.1.2 注册用户蓝图

在项目的入口文件app.py中注册用户蓝图:

# -*- coding: utf-8 -*-
from flask import Flask
from controller.user_controller import user_bp

app = Flask(__name__)
app.register_blueprint(user_bp, url_prefix='/user')

if __name__ == '__main__':
    app.run(debug=True)

4.2 文章管理模块

4.2.1 创建文章蓝图

controller文件夹下创建article_controller.py文件,并定义文章相关的蓝图和路由:

# -*- coding: utf-8 -*-
from flask import Blueprint

article_bp = Blueprint('article', __name__)

@article_bp.route('/add', methods=['POST'])
def add_article():
    return "添加文章成功"

@article_bp.route('/update', methods=['POST'])
def update_article():
    return "更新文章成功"

4.2.2 注册文章蓝图

在项目的入口文件app.py继续注册文章蓝图:

# -*- coding: utf-8 -*-
from flask import Flask
from controller.user_controller import user_bp
from controller.article_controller import article_bp
from controller.comment_controller import comment_bp

app = Flask(__name__)
app.register_blueprint(user_bp, url_prefix='/user')
app.register_blueprint(article_bp, url_prefix='/article')  # 继续注册文章蓝图

if __name__ == '__main__':
    app.run(debug=True)

4.3 评论管理模块

同样的道理,按照上述步骤,创建并注册评论模块的蓝图:

  1. controller文件夹下创建comment_controller.py文件:
# -*- coding: utf-8 -*-
from flask import Blueprint

comment_bp = Blueprint('comment', __name__)


@comment_bp.route('/add', methods=['POST'])
def add_comment():
    return "添加评论成功"


@comment_bp.route('/update', methods=['POST'])
def update_comment():
    return "更新评论成功"

  1. 在项目的入口文件app.py继续注册评论蓝图:
# -*- coding: utf-8 -*-
from flask import Flask
from controller.user_controller import user_bp
from controller.article_controller import article_bp
from controller.comment_controller import comment_bp

app = Flask(__name__)
app.register_blueprint(user_bp, url_prefix='/user')
app.register_blueprint(article_bp, url_prefix='/article')  # 继续注册文章蓝图
app.register_blueprint(comment_bp, url_prefix='/comment')  # 继续注册评论蓝图

if __name__ == '__main__':
    app.run(debug=True)

4.4 测试模块

tests/test_article.py

# -*- coding: utf-8 -*-
import requests

BASE_URL = "http://127.0.0.1:5000"


def test_add_article():
    response = requests.post(f"{BASE_URL}/article/add")
    assert response.text == "添加文章成功"
    print(f"响应内容:{response.text}")


def test_update_article():
    response = requests.post(f"{BASE_URL}/article/update")
    assert response.text == "更新文章成功"
    print(f"响应内容:{response.text}")


test_add_article()
test_update_article()

tests/test_comment.py

# -*- coding: utf-8 -*-
import requests

BASE_URL = "http://127.0.0.1:5000"


def test_add_comment():
    response = requests.post(f"{BASE_URL}/comment/add")
    assert response.text == "添加评论成功"
    print(f"响应内容:{response.text}")


def test_update_comment():
    response = requests.post(f"{BASE_URL}/comment/update")
    assert response.text == "更新评论成功"
    print(f"响应内容:{response.text}")


test_add_comment()
test_update_comment()

tests/test_user.py

# -*- coding: utf-8 -*-
import requests

BASE_URL = "http://127.0.0.1:5000"


def test_add_user():
    response = requests.post(f"{BASE_URL}/user/add")
    assert response.text == "添加用户成功"
    print(f"响应内容:{response.text}")


def test_update_user():
    response = requests.post(f"{BASE_URL}/user/update")
    assert response.text == "更新用户成功"
    print(f"响应内容:{response.text}")


test_update_user()
test_add_user()

4.5 依赖包

requirements.txt

Flask==3.0.3
requests==2.26.0

5. 把它跑起来

  1. 创建项目结构:
    参考上述项目结构自行创建。

  2. 安装依赖:
    在项目根目录下,安装依赖。

    # 进入你的本地虚拟环境后,执行下述命令安装依赖
    pip install -r requirements.txt
    
  3. 运行应用:
    在项目根目录下, 运行 app.py 启动Flask应用。

    python app.py
    

运行效果如图:
在这里插入图片描述

  1. 测试接口:
    这里我们使用的是 requests 模块编写的测试脚本,它位于 flask_project/tests/ 目录下。
    在项目根目录下,进入tests目录下,然后运行这些测试脚本来测试接口功能。

    python test_article.py
    python test_comment.py
    python test_user.py
    

运行效果如图:
在这里插入图片描述
在这里插入图片描述

愿你的努力,被世界看到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/649051.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

助力企业标准化搭建--图框模板的创建

古有秦皇书同文、车同轨,今各行各业都有国际标准、国家标准,其目的就是为了标准化、统一化,由此可见标准化的重要性;一个企业若是想规范员工的操作,推行标准化也很重要;因此对于需要绘制电气图纸的行业来说…

从0开始学统计-秩和检验

1.什么是秩和检验? 秩和检验,也称为Wilcoxon 秩和检验,是一种非参数统计检验方法,用于比较两个独立样本的中位数是否有显著差异。它不要求数据满足正态分布假设,因此适用于小样本或者数据不满足正态分布假设的情况。 …

2024年怎么下载学浪app视频

想要在2024年紧跟潮流,成为一名优秀的学浪用户吗?今天就让我们一起探索如何下载学浪app视频吧! 学浪视频下载工具打包 学浪下载工具打包链接:百度网盘 请输入提取码 提取码:1234 --来自百度网盘超级会员V10的分享…

性能怪兽!香橙派 Kunpeng Pro 开发板深度测评,带你解锁无限可能

性能怪兽!香橙派 Kunpeng Pro 开发板深度测评,带你解锁无限可能 文章目录 性能怪兽!香橙派 Kunpeng Pro 开发板深度测评,带你解锁无限可能一、背景二、香橙派 Kunpeng Pro 硬件规格概述三、使用准备与系统安装1️⃣、系统安装步骤…

字节面试:百亿级数据存储,怎么设计?只是分库分表吗?

尼恩:百亿级数据存储架构起源 在40岁老架构师 尼恩的读者交流群(50)中,经常性的指导小伙伴们改造简历。 经过尼恩的改造之后,很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会&#xff0c…

cuda 11.6 pytorch安装

在安装之前,需要先配置GPU环境(安装CUDA和CudaNN) 命令行输入nvidia-smi,查看驱动信息 nvidia-smi 安装相应的CUDA 和CUDANN 验证:输入nvcc --version 或者nvcc -V 进行检查 nvcc --version nvcc -V 在anaconda里创建环境 con…

彭永东所交“答卷”道尽万般无奈,贝壳找房营收、利润双双锐减

就今年第一季度业绩披露后两日的股价变动来看,贝壳找房(下称“贝壳”)似乎并未在港股和美股市场取得预期的效果。 港股市场,截至5月24日收盘,贝壳-W(HK:02423)报收43.9港元/股,当日跌…

海外网红营销新趋势:“快闪式”营销如何迅速提升品牌曝光度

在当今数字化时代,海外网红营销已成为品牌迅速触达全球消费者、提升品牌曝光度和刺激销售的重要手段。其中,“快闪式”营销以其独特的时效性、创意性和互动性,成为品牌与海外网红合作的新趋势。本文Nox聚星将和大家探讨如何利用海外网红的影响…

梭住绿色,植梦WILL来,容声冰箱“节能森林计划”再启航

近日,容声冰箱再度开启了“节能森林计划”绿色公益之旅。 据「TMT星球」了解,此次活动深入到阿拉善荒漠化地带,通过实地考察和亲身体验,见证容声了“节能森林计划”项目的持续落地和实施效果。 2022年,容声冰箱启动了…

5个好用的AI写论文网站推荐

目录 1.AIQuora论文写作 2.passyyds 答辩PPT 3.AIPassgo论文降AIGC 4.文状元 5.passyyds论文写作 毕业论文是每个毕业生的痛,不管你是本科还是硕士要想顺利毕业你就不得不面对论文。然而,面对论文写作时常常感到无从下手:有时缺乏灵感&a…

微信小程序毕业设计-跑腿系统项目开发实战(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

ChAMP加载肺癌数据和分析甲基化数据流程

ChAMP加载肺癌数据和分析甲基化数据流程 1. 加载数据分析 #!/bin/evn R rm(list = ls()) library(rstudioapi) current_script_path <- getActiveDocumentContext()$path# 将路径转换为当前目录 current_directory <- dirname(current_script_path)# 设置当前工作目录 …

【数据结构】红黑树——领略天才的想法

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 二叉搜索树 AVL树 红黑树概述 性质详解 效率对比 旋转操作 元素操作 代码实现 二叉搜索树 【数据结构】二叉搜索树-CSDN博客 AVL树 【数据结构】AVL树——平衡二叉搜索…

摸鱼大数据——Hive表操作——基本操作

Hive表操作 Hive乱码解决 1、乱码现象 create database test1 comment "乱码测试"; use test1; CREATE TABLE orders ( orderId bigint COMMENT 订单id, orderNo string COMMENT 订单编号, shopId bigint COMMENT 门店id ); 2、处理步骤 注意&#…

uniapp页面vue3下拉触底发送获取新数据请求实现分页功能

页面下拉触底获取新数据实现分页功能实现方式有两种&#xff0c;根据自己的业务需求来定&#xff0c;不同的方案适用场景不一样&#xff0c;有的是一整个页面下拉获取新数据&#xff0c;有的是部分盒子内容滚动到底部时候实现获取新数据&#xff0c;下面讨论一下两种方式的区别…

是他将计算机从“一屋子”变成“一柜子”——量子前哨缅怀小型机之父 戈登·贝尔

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;6000字丨15分钟阅读 5 月 21 日&#xff0c; 美国贝尔实验室资深人士 John Mashey 发布消息称&#xff0c;计算机先驱戈登贝尔&#xff08;Gordon…

精通C++ STL(二):string类的模拟实现

目录 string类各函数接口总览 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载函数 析构函数 迭代器相关函数 begin和end 容量和大小相关函数 size和capacity reserve和resize empty 修改字符串相关函数 push_back append operator insert erase clear swap c_str 访…

[数据集][目标检测]森林火灾检测数据集VOC+YOLO格式362张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;362 标注数量(xml文件个数)&#xff1a;362 标注数量(txt文件个数)&#xff1a;362 标注类别…

《开发问题解决》Window下7z解压:cannot create symbolic link : 客户端没有所需的特权

问题描述&#xff1a; 今天使用7z来解压东西的是突然出现这个问题。 问题解决&#xff1a; download直接下载到c盘中&#xff0c;由于所在文件夹有权限限制。无法进行正常解压。 7.zip解压时使用管理员权限进行解压&#xff0c;解压时使用管理员权限。即如图 使用管理员权限重…

代码随想录算法训练营第四十一天|动态规划理论基础、509. 斐波那契数列、70. 爬楼梯、746. 使用最小花费爬楼梯

动态规划理论基础 什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就…