Flask入门教程(十四):蓝图(Blueprint)——模块化组织大型项目的利器

发布时间:2026/10/29 4:28:15

Flask入门教程(十四):蓝图(Blueprint)——模块化组织大型项目的利器 1. 为什么需要蓝图蓝图解决的核心问题问题蓝图如何解决代码组织将相关的路由、模板、静态文件归为一组复用性同一个蓝图可以注册到不同应用或注册多次加不同前缀团队协作不同开发者负责不同的蓝图模块减少冲突2. 创建蓝图蓝图使用Blueprint类创建用法和Flask非常相似——同样的路由装饰器、同样的视图函数写法。auth.py用户认证蓝图from flask import Blueprint, render_template, request, session, redirect, url_for # 创建蓝图实例 # 第一个参数 auth 是蓝图的名称用于 url_for 引用 # __name__ 告诉蓝图从哪里查找模板和静态文件 bp Blueprint(auth, __name__) bp.route(/login, methods[GET, POST]) def login(): if request.method POST: username request.form.get(username, ) if username: session[username] username return redirect(url_for(blog.index)) return render_template(auth/login.html) bp.route(/register, methods[GET, POST]) def register(): if request.method POST: username request.form.get(username, ) if username: return redirect(url_for(auth.login)) return render_template(auth/register.html) bp.route(/logout) def logout(): session.clear() return redirect(url_for(blog.index))blog.py博客蓝图from flask import Blueprint, render_template bp Blueprint(blog, __name__) bp.route(/) def index(): posts [ {title: Flask 入门, author: runoob}, {title: Blueprint 详解, author: RUNOOB}, ] return render_template(blog/index.html, postsposts) bp.route(/create, methods[GET, POST]) def create(): return render_template(blog/create.html)3. 注册蓝图蓝图创建后不会自动生效需要在应用中注册app.pyfrom flask import Flask from auth import bp as auth_bp from blog import bp as blog_bp app Flask(__name__) app.secret_key dev-secret-key # 注册蓝图到应用 # url_prefix为蓝图中所有路由添加统一的前缀 app.register_blueprint(auth_bp, url_prefix/auth) # auth蓝图的路由变成/auth/login, /auth/logout, /auth/register app.register_blueprint(blog_bp) # blog蓝图不带前缀路由保持/、/create注册后的完整路由表URL蓝图endpointurl_for使用/blogblog.index/createblogblog.create/auth/loginauthauth.login/auth/registerauthauth.register/auth/logoutauthauth.logout⚠️注意注册蓝图后url_for()中的endpoint需要加上蓝图名前缀例如url_for(auth.login)而非url_for(login)。4. url_for在蓝图中的使用跨蓝图引用完整endpoint# 在auth蓝图内部引用blog蓝图的视图 blog_url url_for(blog.index) # 跨蓝图引用同蓝图内部引用相对引用# 在auth.py内部使用相对引用更简洁 bp.route(/dashboard) def dashboard(): # 同蓝图内的相对引用以 . 开头 login_url url_for(.login) # 等价于 url_for(auth.login) register_url url_for(.register) # 等价于 url_for(auth.register)url_for()写法实际生成的endpointurl_for(.login)蓝图内部auth.loginurl_for(auth.login)任意位置auth.loginurl_for(blog.index)任意位置blog.index5. 蓝图的模板与静态文件方式一使用蓝图独立模板文件夹不推荐# 创建带有独立模板文件夹的蓝图 bp Blueprint(auth, __name__, template_foldertemplates) # 路径auth/templates/auth/login.html # 渲染时render_template(auth/login.html)方式二统一模板目录推荐最简单的做法是不给蓝图配置独立模板文件夹模板统一放在项目根目录的templates/下用子目录区分myflaskapp/ ├── app.py ├── auth.py ├── blog.py ├── templates/ # 应用级模板统一管理 │ ├── base.html # 公共布局 │ ├── auth/ # auth蓝图的模板 │ │ ├── login.html │ │ └── register.html │ └── blog/ # blog蓝图的模板 │ ├── index.html │ └── create.html └── static/ # 应用级静态文件统一管理 └── style.css查找顺序Flask会先在应用的templates/中查找找不到再去蓝图指定的template_folder文件夹查找。6. 蓝图中的请求钩子蓝图也支持before_request、errorhandler等装饰器用法和app一致bp.before_request def check_login(): 在auth蓝图的所有请求前检查登录状态 # 排除登录和注册页面 if request.endpoint not in (auth.login, auth.register): if username not in session: return redirect(url_for(auth.login)) bp.errorhandler(404) def not_found(error): auth蓝图专用的404错误页面 return render_template(auth/404.html), 404装饰器作用范围说明bp.before_request该蓝图的所有请求请求前执行可提前返回响应bp.after_request该蓝图的所有请求请求后执行可修改响应bp.errorhandler(code)该蓝图的路由仅捕获该蓝图路由中发生的错误7. 工厂模式create_app随着蓝图变多直接在模块顶层创建app Flask(__name__)会遇到循环导入问题。工厂模式是解决这个问题的最佳实践。app.pyfrom flask import Flask def create_app(): 应用工厂函数——返回配置好的Flask实例 app Flask(__name__) app.secret_key dev-secret-key # 加载配置 app.config.from_pyfile(config.py, silentTrue) # 在函数内部导入蓝图避免循环引用 from auth import bp as auth_bp from blog import bp as blog_bp # 注册蓝图 app.register_blueprint(auth_bp, url_prefix/auth) app.register_blueprint(blog_bp) return app工厂模式的优势优势说明消除循环导入蓝图可以导入appapp也可以导入蓝图因为导入发生在函数内部支持测试可以创建不同配置的app实例进行测试多实例部署同一份代码可以创建多个独立的app实例启动工厂模式应用# 方式一通过--app指定工厂函数 flask --app app:create_app() run # 方式二设置环境变量如果使用python-dotenv # .flaskenv中配置FLASK_APPapp:create_app() flask run8. 蓝图最佳实践目录结构推荐的中大型Flask项目目录结构myflaskapp/ ├── app/ # 应用包 │ ├── __init__.py # create_app() 工厂函数 │ ├── config.py # 配置定义 │ ├── models/ # 数据模型 │ │ ├── __init__.py │ │ ├── user.py │ │ └── post.py │ ├── blueprints/ # 蓝图模块 │ │ ├── __init__.py │ │ ├── auth/ # 认证蓝图 │ │ │ ├── __init__.py │ │ │ └── routes.py │ │ └── blog/ # 博客蓝图 │ │ ├── __init__.py │ │ └── routes.py │ ├── templates/ # 模板文件 │ │ ├── base.html │ │ ├── auth/ │ │ └── blog/ │ └── static/ # 静态文件 │ ├── css/ │ └── js/ ├── migrations/ # 数据库迁移 ├── tests/ # 测试代码 ├── .flaskenv # 环境变量 ├── requirements.txt └── run.py # 启动入口可选app/init.py 示例from flask import Flask from flask_sqlalchemy import SQLAlchemy db SQLAlchemy() def create_app(config_classconfig.DevelopmentConfig): app Flask(__name__) app.config.from_object(config_class) # 初始化扩展 db.init_app(app) # 注册蓝图 from app.blueprints.auth import bp as auth_bp from app.blueprints.blog import bp as blog_bp app.register_blueprint(auth_bp, url_prefix/auth) app.register_blueprint(blog_bp) return app9. 蓝图vs普通模块对比对比维度蓝图普通模块无蓝图路由组织bp.route()分组管理全部堆在app.route()URL前缀注册时统一添加url_prefix需在每个路由中手动添加url_for()需加蓝图名前缀auth.login直接使用函数名login模板查找可在蓝图指定template_folder统一使用应用templates/复用性可注册到多个应用不可复用适合规模中大型项目小型项目/学习小结本章全面讲解了Flask的蓝图Blueprint模块化方案。蓝图通过Blueprint类创建使用bp.route()定义路由通过app.register_blueprint()注册到应用并可选url_prefix统一添加前缀url_for()跨蓝图需使用蓝图名.函数名格式同蓝图内可使用相对引用.函数名蓝图支持独立的before_request和errorhandler工厂模式create_app()在函数内部注册蓝图消除循环导入便于测试和配置管理。蓝图是组织大型Flask项目的核心工具建议在项目初期就合理规划蓝图划分。
延伸阅读

更多相关文章

2026/10/25 20:15:36

FPGA器件组成与分类

一、FPGA器件组成1. 总述FPGA(Field Programmable Gate Array,现场可编程门阵列)的本质是"大规模可配置逻辑资源 可编程布线网络 专用硬核电路"的组合。宏观上,Xilinx 7 系列 / Intel 系列器件的内部由以下资源构成&a…

2026/10/24 14:20:44

基于Qwen-Plus大模型与知识图谱的智能出题系统设计与实现

这次我们要做的不是传统题库管理系统,而是一个真正接通真实大模型能力的“智能生成题目系统”。核心思路很直接:后端调用阿里云百炼的 Qwen-Plus 大模型接口,根据指定知识点、题型、难度自动生成题目;再用 Neo4j 把“题目—知识点…

2026/10/25 8:19:14

2026小程序端AI配音技术实现:TTS多音色引擎集成与MP3生成优化

AI 配音技术在过去几年经历了从规则合成到神经网络的完整演进。早期拼接合成依赖音库规模,音色数量是硬指标;现在的端到端神经网络 TTS 把音色建模进模型参数,多音色切换从"换音库"变成"换嵌入向量",成本和灵…

2026/10/29 4:23:58

DeepSeek本地部署全流程:显存、CUDA环境与4-bit量化

简介:这份PDF文档聚焦DeepSeek大模型的本地化部署,面向希望私有化运行开源模型的企业开发者、运维人员及具备一定Linux与深度学习基础的个人研究者,帮助其在数据安全、定制化需求和算力规划之间建立可落地的配置方案。包内仅含1个PDF文件&…

2026/10/29 4:23:58

读懂QFN封装尺寸图:公差契约、焊盘补偿与钢网设计

简介:QFN系列元器件封装尺寸图是一份面向PCB设计工程师与硬件开发人员的参数速查资料,主要用于QFN封装选型、焊盘布设及封装兼容性核对。压缩包内共1个PDF文件,约981KB,集中收录多组QFN封装尺寸图,并以毫米和英寸双单位…

2026/10/29 4:23:58

Rollup构建工具:原理、配置与优化实践

1. 为什么选择Rollup作为构建工具在开始梳理Rollup的构建流程之前,我们需要先理解为什么Rollup会成为现代前端构建的重要选择。Rollup最初由Rich Harris开发,旨在解决当时构建工具在打包JavaScript库时面临的痛点。与Webpack这样的全能型构建工具不同&am…

2026/10/29 4:23:58

原核表达系统选型与避坑:T7启动子、DE3菌株和IPTG条件优化

简介:围绕原核表达实验流程整理的这份 doc 文档,面向分子生物学方向的研究生与实验人员,重点解决目的蛋白在大肠杆菌中表达效率偏低、可溶性差、质粒不稳定等常见困扰。文档以 Novagen 的 pET 系列载体与 T7 噬菌体转录系统为主线&#xff0c…

2026/10/29 4:23:58

hyperframes:HTML-CSS-MP4三件套动效范式

1. “hyperframes”不是新框架,而是HTML动效表达范式的悄然升级最近在几个前端技术群和设计协作频道里,频繁看到“hyperframes”这个词被提起——不是作为某个开源库的名称,也不是某家公司的新产品代号,而是一种正在被自发实践、尚…

2026/10/29 4:18:57

EN 55022标准详解:信息技术设备EMC辐射与传导发射合规指南

简介:本资源为欧洲标准EN 55022:2006A1:2007正式版PDF文档,面向电子电气工程师、EMC测试人员、ITE设备研发与认证工程师,解决信息技术设备电磁兼容性(EMC)设计与合规验证中的核心依据缺失问题。标准明确规定了计算机、…

2026/10/28 14:42:12

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/28 15:28:56

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/29 0:03:42

学生选课系统DFD图绘制指南:边界划分与分层校验实战

简介:文档以顶层与第一层DFD图为核心,完整刻画学生选课系统的逻辑模型,面向软件工程课程设计、系统分析学习及毕设前期建模人群。顶层图界定系统边界,外部实体包括管理员、教师和学生三类角色;第一层图进一步细化用户登…

2026/10/29 0:03:42

JIRA敏捷落地:Scrum角色权限、Sprint与燃尽图避坑指南

简介:围绕“基于JIRA的敏捷开发项目管理”这一主题,面向产品负责人、Scrum Master及研发测试成员,梳理Scrum角色分工、迭代流程与JIRA工具配置的对应关系,适合初、中级团队导入敏捷管理时参考。压缩包共1个docx文件,大…

2026/10/29 0:03:42

SEMI S8人机工程验收实战:从条款拆解到现场实测的完整指南

简介:面向半导体设备设计、制造与运维工程师及安全合规人员,这份资料聚焦SEMI标准体系下的设备安全规范,重点收录SEMI S8-0308《半导体制造设备人体工程学工程安全指南》。内容围绕设备设计原则、错误与事故预防、人体工程学适配三大主线展开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑