Flask 蓝图路由的模块化开发

news2025/1/12 6:50:37

基于 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
    

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Matlab实现声纹识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 声纹识别,也称为说话人识别,是一种通过声音判别说话人身份的生物识别技…

高效爬取Reddit:C#与RestSharp的完美结合

介绍 在数据驱动的时代,网络爬虫已经成为获取网页数据的重要工具。Reddit,作为全球最大的社区平台之一,以其丰富的用户生成内容、广泛的讨论话题和实时的信息更新吸引了大量用户。对于研究人员和开发者而言,Reddit提供了宝贵的数…

nextcloud 安装部署

php版本不对 ubuntu nginx 配置php 网站-CSDN博客 抄自chatgpt ubuntu完全卸载干净某个包-CSDN博客 以及设置基本的php nginx环境参照上面两篇博文 然后参照官方文档 Example installation on Ubuntu 22.04 LTS — Nextcloud latest Administration Manual latest document…

靶机hackNos Os-Bytesec练习报告

hackNos: Os-Bytesec靶机练习实践报告 下载地址*😗 https://drive.google.com/open?id1yBuih2CsBx45oTUDpFr4JldrzkaOTTeZ https://download.vulnhub.com/hacknos/Os-ByteSec.ova https://download.vulnhub.com/hacknos/Os-ByteSec.ova.torrent ( Magnet) …

# 分布式链路追踪_skywalking_学习(1)

分布式链路追踪_skywalking_学习(1) 一、APM 系统概述 1、什么是 APM 系统? APM :全称 Application Performance Management 即应用性能管理系统。是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。…

基于Django的美团药品数据分析与可视化系统,有多用户功能,可增删改查数据

背景 随着电子商务和健康产业的迅速发展,药品行业数据的分析和可视化变得愈发重要。基于Django的美团药品数据分析与可视化系统的研究背景凸显了对药品数据的深入挖掘和分析的需求。该系统不仅具备多用户功能,允许不同角色的用户进行数据管理和分析&…

【3DMAX教程插件】3DMAX泰森破碎插件使用方法

3DMAX泰森破碎插件,一键破碎物体,在保留体积的同时破碎网格对象。 【适用版本】 3dMax2009及更高版本 【安装方法】 3DMAX泰森破碎插件无需安装,使用时直接拖动插件脚本文件到3dMax视口中打开即可! 【主要功能】 v1.0&#…

气膜建筑的工作原理与优势解析—轻空间

近年来,气膜建筑凭借其独特的结构设计和诸多优点,迅速成为建筑领域的热门选择。本文将详细介绍气膜建筑的工作原理、机械系统、智能控制、索网控制和空气净化等方面,为您提供全面了解气膜建筑的基础知识。 气膜建筑的工作原理 气膜建筑是一种…

翻译《The Old New Thing》- Which windows appear in the Alt+Tab list?

Which windows appear in the AltTab list? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071008-00/?p24863 Raymond Chen 2007年10月08日 有读者Phil Quirk询问,AltTab切换列表中显示哪些窗口的规则是什么。 规则其实相当…

WT2003HX-16S新能源电动汽车低速报警器方案

一:低速报警器应用场景: 为在工业化发展中对外实现弯道超车,其中新能源汽车行业就为国家战略布局方向之一,前景比较广阔。随之配套的各类警报系统方案也蓬勃发展,其中低速报警器(AVAS)作为关键安…

数字孪生时代来临,实景三维千亿级别市场爆发在即

想象一下,当我们将整座城市搬到虚拟世界,点点鼠标就能实时掌握城市运行情况,可以实现数字空间与现实空间的实时互联互通、在线治理,是不是听起来像科幻电影一样不可思议? 现在,通过运用遥感测绘、大数据、云…

前端项目使用docker编译发版和gitlab-cicd发版方式

项目目录 app/ ├── container/ │ ├── init.sh │ ├── nginx.conf.template ├── src/ ├── .gitlab-ci.yml └── deploy.sh └── Dockerfile └── Makefilecontainer目录是放nginx的配置文件,给nginx镜像使用 .gitlab-ci.yml和Makefile是c…

JetLinks物联网平台初步使用——TCP接入

基于上一篇,完整的搭建了前后端整个系统,可以在windows 7完美的运行使用。 目录 1、创建网络组件 2、创建协议管理 3、创建网关 ​4、创建产品 ​5、创建设备 6、模拟对接 1、创建网络组件 进入平台后(用户名密码都是admin&#xff…

【代码随想录】【算法训练营】【第17天】 [110]平衡二叉树 [257]二叉树的所有路径 [404]左叶子之和

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 17,又是一个令人愉快的周五~ 题目详情 [110] 平衡二叉树 题目描述 110 平衡二叉树 解题思路 前提:平衡二叉树:左右子树高度差不超过1, 思路:…

高性能推理框架漫谈

传统模型分布式推理框架 Tensorflow servingPytorch ServingTriton Server 大语言模型的推理框架 其中, VLLM 后端接入了Ray 框架, 作为调度请求的分发处理;除此之外,还包括Nvidia 最新推出的TensorRT-LLM, 增加了对…

开放式耳机怎么选择!教你几招!2024开放式蓝牙耳机推荐

在面对市场上琳琅满目的开放式耳机时,许多用户可能会感到难以抉择。作为一名开放式耳机的爱好者,我根据自己的实际使用体验,整理了一些我认为值得推荐的开放式耳机,希望能为正在寻找合适耳机的朋友们提供一些参考和帮助。我将为大…

【真实项目中收获的提升】- 前后端联调

场景 小型项目前后端联调,不需要部署到sit或uat环境下。 解决方法 后端部署frp服务 下载frp软件 配置frpc.ini文件,先把文件设置可编辑(可同时配置多个 例如下面的chz 上面打码的是frp服务器地址) 然后起start.bat 其实就是执行frpc -c frpc.ini命令…

前端 CSS 经典:元素倒影

前言&#xff1a;好看的元素倒影&#xff0c;可以通过-webkit-box-reflect 实现。但有兼容问题&#xff0c;必须是 webkit 内核的浏览器&#xff0c;不然没效果。但是好看啊。 效果图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"&g…

使用第三方的PyCharm开发工具

目录 PyCharm下载 PyCharm安装 运行PyCharm 创建工程目录 编写“hello world”程序 在同一个工程下创建多个程序文件 运行程序的多种方法 保存程序 关闭程序或工程 删除程序 打开最近的工程 调试断点 熟悉PyCharm开发环境 设置Python解析器 输出彩色控制台文字及…

【C语言】实现贪吃蛇--项目实践(超详细)

前言&#xff1a; 贪吃蛇游戏大家都玩过吧&#xff1f;这次我们要用C语言来亲手制作一个&#xff01;这个项目不仅能让我们复习C语言的知识&#xff0c;还能了解游戏是怎么一步步做出来的。我们会一起完成蛇的移动、食物的生成&#xff0c;还有碰撞检测等有趣的部分。准备好了…