发布时间:2026/8/30 15:55:02
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/8/30 15:55:02

FPGA器件组成与分类

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

2026/8/30 15:55:02

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

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

2026/8/30 15:55:02

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

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

2026/8/30 16:10:03

STM32F446RE从CubeMX生成到Make构建烧录全流程排坑指南

先说个真实场面:我拿到一块Nucleo-F446RE,在STM32CubeMX里把引脚配好,时钟树按需求设好,点下Generate Code,一切看起来都很顺。结果回到终端敲了个make,屏幕上瞬间滚出一片红色报错。那一刻心里想的和搜这个…

2026/8/30 16:10:03

斐讯2017秋招Java笔试试卷复盘:核心考点与避坑指南

说实话,整理这份《斐讯2017秋招Java笔试试卷》复盘的时候,我自己也感叹了一句:当年的校招题放到今天,依然能精准戳中大量候选人的知识盲区。很多人以为校招笔试考的是“会不会写代码”,实际上考的是三件事:…

2026/8/30 16:10:03

STM32H7接入USB摄像头:UVC协议栈、带宽规划与图像采集实战指南

做嵌入式的人,尤其是刚把手伸到STM32H7这颗芯片上的朋友,看到“I want to connect a USB camera to an STM32H7 board”这句话时,大概率是有点低估了这件事的。你以为是把摄像头的USB线插到板子的USB口上、然后读像素数据这么简单&#xff1f…

2026/8/30 16:10:03

数据驱动磁芯损耗建模:从Steinmetz公式到机器学习实战

简介:本资源面向参加2024年‘华为杯’研究生数学建模竞赛C题的参赛队伍,聚焦‘数据驱动下磁性元件的磁芯损耗建模’这一工程与数学交叉难点,提供从问题理解、特征工程、模型构建到结果验证的完整解决方案。压缩包共100个文件,含28…

2026/8/30 16:10:03

ddddocr + opencv拖动滑动拼图总偏几个像素

ddddocr cv 总是“偏一点”,通常不是识别错,而是坐标定义、透明边距或缩放比例导致的系统性偏差。目前 ddddocr.slide_match() 返回的是匹配框 target[x1,y1,x2,y2],而不同版本/封装里 target_x 的含义可能并不完全适合直接拿来当拖动距离&a…

2026/8/30 16:05:03

MP2348GTL-Z:这颗24V/4A同步降压芯片,把性能和体积平衡得恰到好处

做消费电子和工业设备的工程师都清楚,24V工业总线转低压的供电需求随处可见,但能在有限空间里稳定输出4A电流、效率还得高的方案,其实并不好找。今天聊的这颗MP2348GTL-Z,来自MPS,是一颗把性能和封装尺寸平衡得很好的同…

2026/8/30 0:03:35

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/30 0:03:35

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/30 0:03:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/30 0:03:35

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/30 0:03:35

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/30 0:03:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/28 16:16:48

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/28 16:16:50

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/28 11:06:45

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…