Flask中的Blueprints:模块化和组织大型Web应用【第142篇—Web应用】
👽发现宝藏
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。
Flask中的Blueprints:模块化和组织大型Web应用
在构建大型Web应用时,良好的组织结构和模块化是至关重要的。Flask提供了Blueprints(蓝图)这一功能,可以帮助我们更有效地组织应用程序的路由和视图。本文将探讨Flask中Blueprints的使用方法以及如何通过蓝图来实现Web应用的模块化。
什么是Blueprints?
Blueprints是Flask中的一种模式,用于将应用程序分解为可重用的模块。每个蓝图实际上是一个包含一组路由、视图和静态文件的Python模块。通过使用蓝图,我们可以将相关功能的代码组织在一起,从而更容易地管理和维护我们的应用程序。
为什么要使用Blueprints?
- 模块化组织:将相关功能的代码放在一起,使得代码更易于理解和维护。
- 路由命名空间:通过在蓝图中定义路由,可以避免路由冲突,并更好地组织应用程序的URL结构。
- 可重用性:蓝图可以在多个应用程序中重复使用,从而促进了代码的可重用性和可扩展性。
如何使用Blueprints?
首先,让我们创建一个简单的Flask应用,并使用蓝图来组织路由和视图。
# app.py
from flask import Flask
from auth import auth_bp
from blog import blog_bpapp = Flask(__name__)# 注册蓝图
app.register_blueprint(auth_bp)
app.register_blueprint(blog_bp)if __name__ == "__main__":app.run(debug=True)
现在,让我们定义两个蓝图:一个用于身份验证,另一个用于博客功能。
# auth.py
from flask import Blueprintauth_bp = Blueprint('auth', __name__)@auth_bp.route('/login')
def login():return 'Login Page'@auth_bp.route('/logout')
def logout():return 'Logout Page'
# blog.py
from flask import Blueprintblog_bp = Blueprint('blog', __name__)@blog_bp.route('/')
def index():return 'Blog Home Page'@blog_bp.route('/post/<int:post_id>')
def post(post_id):return f'Viewing post {post_id}'
在上面的代码中,我们定义了两个蓝图:auth_bp
用于身份验证相关的路由,blog_bp
用于博客相关的路由。
代码解析
- 我们首先导入了
Blueprint
类以及Flask
类。 - 然后我们创建了Flask应用程序实例。
- 接着,我们将定义好的蓝图注册到应用程序中,每个蓝图都有一个唯一的名称和一组路由。
- 最后,我们运行应用程序。
在每个蓝图中,我们使用@blueprint.route()
装饰器定义了不同的路由。在实际应用中,我们可以将相关功能的路由和视图添加到相应的蓝图中,以实现模块化的组织。
高级用法:蓝图之间的通信
除了简单的路由注册外,Blueprints还可以通过一些高级技巧实现更复杂的功能,例如蓝图之间的通信。让我们通过一个示例来说明这一点。
假设我们的博客应用需要在登录后显示用户的个人资料。我们可以在auth
蓝图中处理登录逻辑,并在blog
蓝图中显示用户的个人资料。为了实现这一点,我们可以在蓝图之间共享数据。
# auth.py
from flask import Blueprint, sessionauth_bp = Blueprint('auth', __name__)@auth_bp.route('/login')
def login():# 模拟登录,将用户信息存储在session中session['user'] = {'username': 'example_user'}return 'Login Successful'@auth_bp.route('/logout')
def logout():# 模拟登出,清除session中的用户信息session.pop('user', None)return 'Logout Successful'
# blog.py
from flask import Blueprint, sessionblog_bp = Blueprint('blog', __name__)@blog_bp.route('/')
def index():if 'user' in session:username = session['user']['username']return f'Welcome, {username}! This is your Blog Home Page'else:return 'Welcome to the Blog Home Page'@blog_bp.route('/profile')
def profile():if 'user' in session:username = session['user']['username']return f'Hello, {username}! This is your Profile Page'else:return 'Please login to view your Profile'
在上面的示例中,我们使用了Flask的session
对象来在蓝图之间共享用户信息。在auth
蓝图中,用户成功登录后,我们将用户信息存储在session
中;而在blog
蓝图中,我们可以访问session
中的用户信息来显示用户的个人资料。
高级用法解析
- 我们使用了Flask的
session
对象来在不同请求之间存储用户信息。session
是一个类似字典的对象,可以用来存储和访问用户的会话数据。 - 在
auth
蓝图中,我们在用户登录成功后将用户信息存储在session
中;而在blog
蓝图中,我们通过访问session
中的用户信息来显示用户的个人资料。 - 这种方式使得不同的蓝图可以共享数据,实现了更灵活和可扩展的应用程序结构。
蓝图的模板和静态文件
除了路由和视图之外,Blueprints还可以用于组织模板和静态文件,使得应用程序的文件结构更加清晰。让我们通过一个例子来说明如何在蓝图中使用模板和静态文件。
首先,我们创建一个包含模板和静态文件的蓝图。
# blog.py
from flask import Blueprint, render_templateblog_bp = Blueprint('blog', __name__, template_folder='templates', static_folder='static')@blog_bp.route('/')
def index():return render_template('index.html')@blog_bp.route('/about')
def about():return render_template('about.html')
在上面的示例中,我们在创建blog_bp
蓝图时指定了模板文件夹和静态文件夹的路径。这样,Flask就知道在哪里查找模板和静态文件。
接下来,我们在相应的模板文件夹中创建模板文件。
<!-- templates/index.html -->
<!DOCTYPE html>
<html>
<head><title>Blog Home</title><link rel="stylesheet" href="{{ url_for('blog.static', filename='style.css') }}">
</head>
<body><h1>Welcome to the Blog</h1><p>This is the home page of our blog.</p>
</body>
</html>
<!-- templates/about.html -->
<!DOCTYPE html>
<html>
<head><title>About</title><link rel="stylesheet" href="{{ url_for('blog.static', filename='style.css') }}">
</head>
<body><h1>About Us</h1><p>Learn more about our blog and team.</p>
</body>
</html>
在模板文件中,我们使用url_for()
函数来生成静态文件的URL,并指定了blog.static
作为蓝图的静态文件路径。
最后,我们在静态文件夹中添加样式表文件。
/* static/style.css */
body {font-family: Arial, sans-serif;background-color: #f0f0f0;margin: 0;padding: 0;
}
h1 {color: #333;
}
p {color: #666;
}
解析
- 我们使用了
template_folder
和static_folder
参数来指定蓝图的模板文件夹和静态文件夹的路径。 - 在模板文件中,我们使用
url_for()
函数生成静态文件的URL,并指定了蓝图的静态文件路径。这样做可以确保在蓝图之间的移动时静态文件路径仍然有效。 - 静态文件的引用方式与普通的Flask应用程序中相同,但需要明确指定蓝图的静态文件路径。
通过这种方式,我们可以将模板和静态文件与特定的蓝图相关联,使得文件结构更加清晰,并使应用程序更易于维护和扩展。
测试和文档
在构建大型Web应用程序时,测试和文档是不可或缺的组成部分。Blueprints可以与测试框架和文档生成工具集成,以便更好地管理和维护我们的应用程序。
测试
在使用Blueprints时,我们可以针对每个蓝图编写单元测试,以确保其功能正常。通常,测试蓝图的方法与测试普通的Flask应用程序相同,只需导入相应的蓝图并模拟请求即可。
# test_blog.py
import unittest
from app import appclass TestBlogBlueprint(unittest.TestCase):def setUp(self):self.app = app.test_client()def test_index(self):response = self.app.get('/blog/')self.assertEqual(response.status_code, 200)self.assertIn(b'Welcome to the Blog', response.data)def test_about(self):response = self.app.get('/blog/about')self.assertEqual(response.status_code, 200)self.assertIn(b'About Us', response.data)if __name__ == '__main__':unittest.main()
在上面的示例中,我们编写了针对blog
蓝图的单元测试,以确保其index
和about
路由能够正常工作。
文档
在使用Blueprints时,我们还可以通过文档生成工具自动生成API文档,以便开发人员和团队成员更好地理解应用程序的结构和功能。
# 使用Flask-APIDoc生成API文档
from flask_apidoc import ApiDocapidoc = ApiDoc()# 将蓝图注册到apidoc
apidoc.register_blueprint(auth_bp)
apidoc.register_blueprint(blog_bp)if __name__ == '__main__':apidoc.run(debug=True)
通过将蓝图注册到文档生成工具中,我们可以自动生成包含所有蓝图路由和视图的API文档。这样,开发人员就可以更轻松地查看和理解应用程序的结构和功能。
部署和扩展
一旦我们构建了具有模块化结构的大型Web应用程序,就需要考虑如何部署和扩展该应用程序,以确保其性能和可用性。让我们讨论一下在部署和扩展过程中如何处理Blueprints。
部署
在部署Flask应用程序时,可以使用各种Web服务器和部署工具,例如Gunicorn、uWSGI和Docker。部署过程中,只需确保将应用程序实例化的代码和蓝图注册的代码包含在主应用程序文件中即可。
# app.py
from flask import Flask
from auth import auth_bp
from blog import blog_bpapp = Flask(__name__)# 注册蓝图
app.register_blueprint(auth_bp)
app.register_blueprint(blog_bp)if __name__ == "__main__":app.run(debug=True)
将所有蓝图注册到主应用程序文件中可以确保在部署时所有路由和视图都能正确加载。
扩展
当我们的应用程序需要扩展时,例如增加新的功能模块或处理更多的用户请求,Blueprints可以帮助我们轻松地扩展应用程序。我们只需创建新的蓝图,并将其注册到主应用程序中即可。
# admin.py
from flask import Blueprintadmin_bp = Blueprint('admin', __name__)@admin_bp.route('/dashboard')
def dashboard():return 'Admin Dashboard'
# app.py
from flask import Flask
from auth import auth_bp
from blog import blog_bp
from admin import admin_bpapp = Flask(__name__)# 注册蓝图
app.register_blueprint(auth_bp)
app.register_blueprint(blog_bp)
app.register_blueprint(admin_bp, url_prefix='/admin')if __name__ == "__main__":app.run(debug=True)
在上面的示例中,我们创建了一个名为admin_bp
的新蓝图,并将其注册到主应用程序中。通过使用url_prefix
参数,我们可以指定蓝图的URL前缀,从而轻松地组织不同模块的路由。
性能优化
在构建大型Web应用程序时,性能是一个关键问题。Blueprints可以帮助我们实现更好的性能优化,通过合理的路由分发和模块化设计来提高应用程序的响应速度和可伸缩性。
蓝图的惰性加载
Flask中的Blueprints是惰性加载的,这意味着只有在应用程序第一次收到请求时才会注册和初始化蓝图。这种机制确保了应用程序在启动时加载的速度较快,因为只有在需要时才会加载相关的功能模块。
路由分发
通过合理地组织和分发路由,可以进一步提高应用程序的性能。例如,可以将具有相似功能的路由放在同一个蓝图中,以减少路由匹配的开销。
# blog.py
from flask import Blueprintblog_bp = Blueprint('blog', __name__)@blog_bp.route('/')
def index():return 'Blog Home Page'@blog_bp.route('/post/<int:post_id>')
def post(post_id):return f'Viewing post {post_id}'
在上面的示例中,所有与博客相关的路由都放在了一个名为blog_bp
的蓝图中,这样可以提高路由匹配的效率。
静态文件和缓存
对于静态文件,可以使用Nginx、CDN或Flask的静态文件缓存等方式来加速静态文件的访问。另外,对于动态内容,可以使用缓存技术来减少数据库查询和计算的次数,从而提高响应速度。
安全性考虑
在构建大型Web应用程序时,安全性是至关重要的。Blueprints可以帮助我们实现一些安全性措施,以保护应用程序免受常见的安全威胁。
蓝图级别的中间件
Flask允许我们在蓝图级别应用中间件,这样我们就可以针对特定的蓝图应用安全性措施。
# auth.py
from flask import Blueprint, request, abortauth_bp = Blueprint('auth', __name__)@auth_bp.before_request
def check_request():if not request.is_secure:abort(403)
在上面的示例中,我们在auth
蓝图中应用了一个中间件,用于检查请求是否是安全的(即使用HTTPS)。如果请求不是安全的,就会返回403禁止访问的响应。
蓝图的权限控制
通过在蓝图中实现权限控制逻辑,我们可以限制用户对特定功能的访问。
# admin.py
from flask import Blueprint, abortadmin_bp = Blueprint('admin', __name__)@admin_bp.route('/dashboard')
def dashboard():if not current_user.is_admin:abort(403)return 'Admin Dashboard'
在上面的示例中,我们在admin
蓝图中的dashboard
路由中实现了权限控制逻辑,只有管理员用户才能访问该页面。
安全头部设置
Flask提供了一些内置的安全头部设置,可以在应用程序中设置以增强安全性,例如X-Content-Type-Options
、X-Frame-Options
和Content-Security-Policy
等。
# app.py
from flask import Flask
from flask_talisman import Talismanapp = Flask(__name__)
talisman = Talisman(app)
在上面的示例中,我们使用Flask-Talisman扩展来设置一些安全头部,以保护应用程序免受XSS和点击劫持等攻击。
总结
总的来说,本文深入探讨了在Flask中使用Blueprints来构建大型Web应用程序的方法。Blueprints提供了一种模块化的方式来组织应用程序的路由、视图、模板和静态文件,使得应用程序更易于管理和维护。通过合理利用Blueprints,我们可以实现以下几个方面的优势:
- 模块化组织: 将相关功能的代码放在一起,使得代码更易于理解和维护。
- 路由命名空间: 避免路由冲突,并更好地组织应用程序的URL结构。
- 可重用性: 蓝图可以在多个应用程序中重复使用,促进了代码的可重用性和可扩展性。
- 高级功能支持: 可以实现蓝图之间的通信、模板和静态文件的组织、测试和文档的生成、部署和扩展以及性能优化和安全性考虑等功能。
通过本文所介绍的内容,开发人员可以更好地利用Blueprints来构建大型、模块化的Web应用程序,并在实践中不断优化和完善应用程序的结构和功能,以满足不断变化的需求和挑战。
相关文章:

Flask中的Blueprints:模块化和组织大型Web应用【第142篇—Web应用】
👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Flask中的Blueprints:模块化和组织大型Web应用 在构建大型Web应用时࿰…...

如何通过idea搭建一个SpringBoot的Web项目(最基础版)
通过idea搭建一个SpringBoot的Web项目 文章目录 通过idea搭建一个SpringBoot的Web项目一、打开idea,找到 create new project二、创建方式三、配置项目依赖四、新建项目模块五、总结 一、打开idea,找到 create new project 方式1 方式2 二、创建方式 新…...
Python和FastAPI语义分析和文本图像
要点 使用FastAPI开发RESTful API,创建端点,自定义响应,结构化多路由。Pydantic数据验证库数据建模,创建依赖项注入。开发数据库和对象关系映射,SQLAlchemy,Tortoise ORM,MongoDB。建立权限和安…...
centos系统ssh7.4升级9.6
编译安装 OpenSSL 下载 OpenSSL 源代码: wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz这个命令从 OpenSSL 的官方网站下载指定版本(1.1.1w)的源代码压缩包。 解压源代码: tar zxvf openssl-1.1.1w.tar.gz使用 tar…...

excel所有知识点
1要加双引号 工作表(.xlsx) 单击右键→插入,删除,移动、重命名、复制、设置标签颜色,选定全部工作表 工作表的移动:两个表打开→右键→移动(如果右键是灰色的,可能是保护工作表了)…...

显卡基础知识及元器件原理分析
显卡应该算是是目前最为火热的研发方向了,其中的明星公司当属英伟达。 当地时间8月23日,英伟达发布截至7月30日的2024财年第二财季财报,营收和利润成倍增长,均超市场预期。 财报显示,第二财季英伟达营收为135.07 亿美…...

Spark Rebalance hint的倾斜的处理(OptimizeSkewInRebalancePartitions)
背景 本文基于Spark 3.5.0 目前公司在做小文件合并的时候用到了 Spark Rebalance 这个算子,这个算子的主要作用是在AQE阶段的最后写文件的阶段进行小文件的合并,使得最后落盘的文件不会太大也不会太小,从而达到小文件合并的作用,…...

Vue 3中实现基于角色的权限认证实现思路
一、基于角色的权限认证主要步骤 在Vue 3中实现基于角色的权限认证通常涉及以下几个主要步骤: 定义角色和权限:首先需要在后端服务定义不同的角色和它们对应的权限。权限可以是对特定资源的访问权限,比如读取、写入、修改等。用户认证&#…...

Visual Studio 2022进行文件差异比较
前言 Visual Studio 2022在版本17.7.4中发布在解决方案资源管理器中比较文件的功能,通过使用此功能,可以轻松地查看两个文件之间的差异,包括添加、删除和修改的代码行。可以逐行查看差异,并根据需要手动调整和编辑文件内容以进行…...

1.2 编译型语言和解释型语言的区别
编译型语言和解释型语言的区别 通过高级语言编写的源码,我们能够轻松理解,但对于计算机来说,它只认识二进制指令,源码就是天书,根本无法识别。源码要想执行,必须先转换成二进制指令。 所谓二进制指令&…...
C语言-常量
什么是常量? 答:常量是在程序执行过程中,其值不发生改变的量,常量分为直接常量和符号常量两种。 其中直接常量又可以分为整型常量、实型常量、字符型常量、字符串常量。 直接常量 1.整型常量 整型常量即整数,包括正整数,负整数和0。c语言中常量可以用八进制,十进制和十六…...

开源的OCR工具基本使用:PaddleOCR/Tesseract/CnOCR
前言 因项目需要,调研了一下目前市面上一些开源的OCR工具,支持本地部署,非调用API,主要有PaddleOCR/CnOCR/chinese_lite OCR/EasyOCR/Tesseract/chineseocr/mmocr这几款产品。 本文主要尝试了EasyOCR/CnOCR/Tesseract/PaddleOCR这…...

vue3实现输入框短信验证码功能---全网始祖
组件功能分析 1.按键删除,清空当前input,并跳转prevInput & 获取焦点,按键delete,清空当前input,并跳转nextInput & 获取焦点。按键Home/End键,焦点跳转first/最后一个input输入框。ArrowLeft/ArrowRight键点击…...

[C#]winformYOLO区域检测任意形状区域绘制射线算法实现
【简单介绍】 Winform OpenCVSharp YOLO区域检测与任意形状区域射线绘制算法实现 在现代安全监控系统中,区域检测是一项至关重要的功能。通过使用Winform结合OpenCVSharp库,并结合YOLO(You Only Look Once)算法,我们…...

个人网站制作 Part 14 添加网站分析工具 | Web开发项目
文章目录 👩💻 基础Web开发练手项目系列:个人网站制作🚀 添加网站分析工具🔨使用Google Analytics🔧步骤 1: 注册Google Analytics账户🔧步骤 2: 获取跟踪代码 🔨使用Vue.js&#…...
数据按设定单位(分辨率)划分的方法
1. 问题描述 需要将使用公式计算后的float数值换算到固定间隔数轴的对应位置上的数据,比如2.186这个数据,将该数据换算到以0.25为间隔的数轴上,换算后是2.0,还是2.25呢?该方法就是解决这个问题。 2. 方法 输入&…...

Ubuntu 搭建gitlab服务器,及使用repo管理
一、GitLab安装与配置 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。 1、安装Ubuntu系统(这个教程很多,就不展开了)。 2、安装gitlab社区版本,有需…...
QT(19)-QNetworkRequest
attribute(QNetworkRequest::Attribute code, const QVariant &defaultValue QVariant()) const 获取指定的请求属性。如果该属性未设置,则返回默认值。 hasRawHeader(const QByteArray &headerName) const 检查是否存在指定名称的原始请求头。 header(Q…...

基于Vue的社区旧衣回收利用系统的设计与实现
经济的高速发展使得每一个家庭的收入都获得了大幅增长,随之而来的就是各种梦想的逐步实现,首当其冲的就是各类衣服的更新换代而导致了大量旧衣物在家中的积存。为了帮助人们解决旧衣物处理的问题而以当前主流的互联网技术构建一个可于社区中实现旧衣回收…...

【网站项目】291校园疫情防控系统
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...