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 Blueprintuser_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_bpapp = 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 Blueprintarticle_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_bpapp = 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 Blueprintcomment_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_bpapp = 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 requestsBASE_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 requestsBASE_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 requestsBASE_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
    

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Uni-App开发 导入(引入)Vant-Weapp组件;支持vue3/vue2版本和微信小程序

文章目录 目录 文章目录 操作流程 小结 概要安装流程技术细节小结 概要 Vant Weapp官网:Vant Weapp - 轻量、可靠的小程序 UI 组件库 准备工作,需要确保自己的电脑上已安装Hbuilde和node 全程操作的环境都需要这些配合才能运行上,可参考作者…

M功能-支付平台(三)

target:离开柬埔寨倒计时-221day 前言 今天周六,但是在柬埔寨还是工作日,想着国内的朋友开始休周末就羡慕呀,记不清在这边过了多少个周六了,多到我已经习惯了。而且今天技术部还停电了,真的是热的受不了呀…

【MATLAB源码-第74期】基于matlab的OFDM-IM索引调制系统不同频偏误码率对比,对比OFDM系统。

操作环境: MATLAB 2022a 1、算法描述 OFDM-IM索引调制技术是一种新型的无线通信技术,它将正交频分复用(OFDM)和索引调制(IM)相结合,以提高频谱效率和系统容量。OFDM-IM索引调制技术的基本思想…

Android 性能为王时代SparseArray和HashMap一争高下

文章目录 一、SparseArray 源码分析1. **类定义和构造函数**2. **基本方法**2.1 put(int key, E value)2.2 get(int key)2.3 delete(int key)2.4 removeAt(int index)2.5 gc()2.6 size()2.7 keyAt(int index) 和 valueAt(int index) 3. **辅助方法**3.1 binarySearch() 二、使用…

【SpringCloud】负载均衡

目录 负载均衡什么是负载均衡生活场景为什么需要负载均衡负载均衡手段负载均衡总的来说有两种实现手段负载均衡具体可以通过多种手段来实现 SpringCloud中的负载均衡组件Ribbon VS Nginx负载均衡区别集中式LB进程内LB RibbonRibbon的工作原理Ribbon在工作时分成两步 使用1.提供…

昔日辉煌不再,PHP老矣,尚能饭否?

导语 | 近期 TIOBE 最新指数显示,PHP 的流行度降至了历史最低,排在第 17 名,同时,在年度 Stack Overflow 开发者调查报告中,PHP 在开发者中的受欢迎程度已经从之前的约 30% 萎缩至现在的 18%。“PHP 是世界上最好的语言…

【开源】大学生竞赛管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、系统介绍 学生管理模块 教师管理模块 竞赛信息模块 竞赛报名模块 二、系统截图 三、核心代码 一、系统介绍 基于Vue.js和SpringBoot的大学生竞赛管理系统,分为管理后台和用户网页端,可以给管理员、学生和教师角色使用,包括学…

【Flutter】Dialog组件PageView组件

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Flutter学习 🌠 首发时间:2024年5月27日 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 目…

如何确保大模型 RAG 生成的信息是基于可靠的数据源?

在不断发展的人工智能 (AI) 领域中,检索增强生成 (RAG) 已成为一种强大的技术。 RAG 弥合了大型语言模型 (LLM) 与外部知识源之间的差距,使 AI 系统能够提供更全面和信息丰富的响应。然而,一个关键因素有时会缺失——透明性。 我们如何能够…

mysql中单表查询的成本

大家好。我们知道MySQL在执行一个查询时,经常会有多个执行方案,然后从中选取成本最低或者说代价最低的方案去真正的执行查询。今天我们来聊一聊单表查询的成本。 那么到底什么是成本呢?这里我们说的成本或者代价是由两方面组成的&#xff1a…

vscode插件-03 PHP

PHP Intelephense 如果php在远程计算机上,要把插件安装在远程,而不是本地。 这个插件,要求php版本大于7,且设置环境变量(好像不一定要设置)。 设置里面搜索php.executablePath,打开setting.js…

element ui 的el-input输入一个字后失去焦点,需重新点击输入框才能再次输入

解决方案: 我是form表单嵌套表格,里面的el-input输入框,输入第一个值的时候会突然失去焦点,需要再次点击输入框才能正常输入,原因是table的key值,需要改成正常的index即可,如果你是循环的&…

ESP32入门:1、VSCode+PlatformIO环境搭建

文章目录 背景安装vscode安装配置中文 安装Platform IO安装PIO 新建ESP32工程参考 背景 对于刚接触单片机的同学,使用vscodeplatformIO来学习ESP32是最方便快捷的,比IDF框架简单,且比arduino文件管理性能更好。但是platformIO安装较为麻烦&a…

gnocchi学习小结

背景 总结gnocchi 4.4版本gnocchi-metricd工作流程 入口 gnocchi.cli.metricd metricd stop after processing metric默认为0,调servicemanager run MetricdServiceManager __init__ 服务逻辑封装到MetricdServiceManager初始化中 主要由MetricProcessor, Met…

【方法】ZIP压缩文件的密码如何设置和取消?

ZIP是一种常见的压缩文件格式,今天来分享一下,ZIP压缩文件如何设置密码保护,以及如何取消密码,不清楚的小伙伴一起来看看吧! 设置ZIP文件密码: 想要给ZIP压缩包设置密码,需要用到支持ZIP格式的…

香橙派 Kunpeng Pro使用教程:从零开始打造个人私密博客

一、引言 在这个日益互联的世界中,单板计算机已经成为创新和个性化解决方案的重要载体。而在单板计算机领域,香橙派 Kunpeng Pro凭借其强大的性能和灵活的应用潜力,正逐渐吸引着全球开发者和技术爱好者的目光。 作为一款集成了华为的鲲鹏处…

【AD21】文件的整理

当所有文件输出完成后,需要对不同的文件去做一个整理,方便后续工作的交接。 在项目工程文件夹下新建名称为BOM、SMT、PRJ、Gerber和DOC的文件夹。 BOM文件夹存放BOM表发给采购人员。SMT文件夹存放装配图文件和坐标文件发给贴片厂。PRJ文件夹存放工程文件…

AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研

目录 前言一、DB-GPT总体概述二、DB-GPT关键特性1、私域问答&数据处理&RAG2、多数据源&GBI3、多模型管理4、自动化微调5、Data-Driven Multi-Agents&Plugins6、隐私安全 三、服务器资源准备1、创建实例2、打开jupyterLab 四、DB-GPT启动1、激活 conda 环境2、切…

2024年03月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 期末考试结束了,全班的语文成绩都储存在列表score中,班主任老师请小明找到全班最高分,小明准备用Python来完成,以下哪个选项,可以获取最高分呢?( ) A:min(score) B:max(score) C:sco…

夏日将至,给手机装个“液冷”降温可行吗?

夏天出门在外,手机总是更容易发热,尤其是顶着大太阳用手机的时候,更是考验手机的散热能力。如果你也是一个对手机体验有追求的人,比较在意手机的温度,那么可以考虑入手一个微泵液冷手机壳。 【什么是微泵液冷壳&#…