当前位置: 首页 > news >正文

flask中的蓝图

在这里插入图片描述

flask中的蓝图

在 Flask 中,蓝图(Blueprint)是一种组织路由和服务的方法,它允许你在应用中更灵活地组织代码。蓝图可以大致理解为应用或者应用中的一部分,可以在蓝图中定义路由、错误处理程序以及静态文件等。然后可以在工厂函数中多次注册同一个蓝图到应用上,可以用URL前缀和/或子域来区分。

蓝图的主要用途是:

  1. 在一个应用内部划分逻辑组件,例如在一个大的系统中可能会有用户认证、电子邮件、资产等不同的组件,每个组件可以用一个蓝图来实现。
  2. 在一个中大型的项目中,可以用蓝图来做到模块化,每个蓝图都可以在一个独立的模块(Python的模块,即一个.py文件或者一个包)中定义和实现。
  3. 复用性:可以在不同的应用中复用蓝图。

下面是一个简单的蓝图的创建和注册的例子:

# 在你的模块里创建一个蓝图
from flask import Blueprint
bp = Blueprint('my_blueprint', __name__)# 在蓝图上定义路由和其他代码
@bp.route('/')
def index():return 'Hello, Blueprint!'# 在你的应用创建时,注册这个蓝图
from flask import Flask
from yourmodule import bpapp = Flask(__name__)
app.register_blueprint(bp)

在这个例子中,你首先创建了一个蓝图,并在上面定义了一个路由。然后,你在创建 Flask 应用时注册了这个蓝图。

用户登录蓝图

from flask import Blueprint, request, session, redirect, url_for, render_template# 创建一个蓝图
auth = Blueprint('auth', __name__)# 登录视图
@auth.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':username = request.form.get('username')password = request.form.get('password')# 这里为了简单,我们假设用户名是'user',密码是'password'# 实际上,你需要去数据库中验证用户名和密码if username == 'user' and password == 'password':session['username'] = usernamereturn redirect(url_for('index'))else:return 'Invalid username or password'else:return render_template('login.html')# 登出视图
@auth.route('/logout')
def logout():if 'username' in session:session.pop('username')return redirect(url_for('index'))

这个蓝图可以在你的应用中使用register_blueprint函数进行注册:

from flask import Flask
from your_module import auth  # 从你的模块导入蓝图app = Flask(__name__)
app.register_blueprint(auth, url_prefix='/auth')

其中,your_module 需要替换为你的蓝图定义的模块名。url_prefix='/auth'意味着所有注册的路由都会添加一个前缀/auth,所以你的登录和登出URL将分别变为/auth/login/auth/logout

复用蓝图

你只需要将蓝图定义在一个模块中,然后在需要的地方导入并注册这个蓝图就可以了。

举个例子,假设我们已经在auth_module.py模块中定义了上面的auth蓝图:

# auth_module.py
from flask import Blueprint, request, session, redirect, url_for, render_templateauth = Blueprint('auth', __name__)@auth.route('/login', methods=['GET', 'POST'])
def login():# ...@auth.route('/logout')
def logout():# ...

然后,你可以在你的多个Flask应用中导入并注册这个蓝图:

# app1.py
from flask import Flask
from auth_module import authapp1 = Flask(__name__)
app1.register_blueprint(auth, url_prefix='/auth')# app2.py
from flask import Flask
from auth_module import authapp2 = Flask(__name__)
app2.register_blueprint(auth, url_prefix='/auth')

在这个例子中,auth蓝图被复用在了两个不同的Flask应用中。在每个应用中,所有的路由都会添加一个/auth的前缀。

所以,要复用一个蓝图,你只需要将蓝图定义在一个模块中,然后在需要的地方导入并注册这个蓝图就可以了。

蓝图路由

当我们在蓝图中定义路由时,生成这些路由的URL需要使用蓝图的名字作为前缀。这样可以避免不同蓝图中的视图函数名发生冲突。以下是一个例子:

首先,我们定义两个蓝图,分别为authmain

# auth.py
from flask import Blueprint, redirect, url_forauth = Blueprint('auth', __name__)@auth.route('/login')
def login():return "Login Page"
# main.py
from flask import Blueprint, redirect, url_formain = Blueprint('main', __name__)@main.route('/')
def index():return redirect(url_for('auth.login'))  # 重定向到auth蓝图的login视图

然后,在主程序中注册这两个蓝图:

# app.py
from flask import Flask
from auth import auth
from main import mainapp = Flask(__name__)
app.register_blueprint(auth, url_prefix='/auth')
app.register_blueprint(main)

在这个例子中,我们在main蓝图的index视图中生成了一个URL,这个URL指向auth蓝图的login视图。生成这个URL的代码是url_for('auth.login'),其中,auth是蓝图的名字,login是视图函数的名字。这行代码会生成一个/auth/login的URL。

注意,url_for函数生成的URL是相对于应用根URL的。如果你在注册蓝图时添加了一个URL前缀,这个前缀也会被添加到生成的URL中。例如,在上面的例子中,我们在注册auth蓝图时添加了一个/auth的前缀,所以url_for('auth.login')生成的URL是/auth/login

在Flask中,url_for函数用于生成URL。在其最简单的形式中,你可以传递一个视图函数的名字,然后它会返回对应的URL。例如,如果你有一个名为login的视图函数,你可以使用url_for('login')来生成对应的URL。

然而,当你开始使用蓝图时,情况就会变得有些复杂。这是因为你可能会在不同的蓝图中使用相同的视图函数名。为了避免冲突,Flask在内部为每个蓝图中的视图函数添加了一个前缀,这个前缀就是蓝图的名字。所以,如果你在auth蓝图中有一个名为login的视图函数,你需要使用url_for('auth.login')来生成对应的URL。

实际上,'auth.login'只是一个字符串,Flask会在内部将它解析为蓝图的名字和视图函数的名字。

所以,当你在使用url_for函数时,你需要记住:

  • 如果你在主应用中(也就是没有使用蓝图的情况下),你可以直接使用视图函数的名字,例如url_for('login')
  • 如果你在蓝图中,你需要在视图函数的名字前添加蓝图的名字和一个点,例如url_for('auth.login')

相关文章:

flask中的蓝图

flask中的蓝图 在 Flask 中,蓝图(Blueprint)是一种组织路由和服务的方法,它允许你在应用中更灵活地组织代码。蓝图可以大致理解为应用或者应用中的一部分,可以在蓝图中定义路由、错误处理程序以及静态文件等。然后可以…...

Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台免费搭建

Java版知识付费-轻松拥有知识付费平台 多种直播形式,全面满足直播场景需求 公开课、小班课、独立直播间等类型,满足讲师个性化直播场景需求;低延迟、双向视频,亲密互动,无论是互动、答疑,还是打赏、带货、…...

uniapp 瀑布流 (APP+H5+微信小程序)

WaterfallsFlow.vue <template><view class"wf-page" :class"props?.paddingC ? paddingC : "><!-- left --><view><view id"left" ref"left" v-if"leftList.length"><viewv-for…...

医疗小程序:提升服务质量与效率的智能平台

在医疗行业&#xff0c;公司小程序成为提高服务质量、优化管理流程的重要工具。通过医疗小程序&#xff0c;可以方便医疗机构进行信息传播、企业展示等作用&#xff0c;医疗机构也可以医疗小程序提供更便捷的预约服务&#xff0c;优化患者体验。 医疗小程序的好处 提升服务质量…...

ComPDFKit 转档SDK OCR表格识别功能

我们非常高兴地宣布&#xff0c;适用于 Windows、iOS、Android 和服务器的 ComPDFKit 转档SDK 1.8.0 现已发布&#xff01;在该版本中&#xff0c;OCR 功能支持了表格识别&#xff0c;优化了OCR文字识别率。PDF to HTML 优化了html 文件结构&#xff0c;使转换后的 HTML 文件容…...

华为OD机考--阿里巴巴黄金箱

题目内容 贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0~N的箱子每个箱子上面贴有一个数字箱子中可能有一个黄金宝箱。 黄金宝箱满足排在它之前的所有箱子数字和等于排在它之后的所有箱子数字之和; 一个箱子左边部分…...

mybatis-config.xml-配置文件详解

文章目录 mybatis-config.xml-配置文件详解说明文档地址:配置文件属性解析properties 属性应用实例 settings 全局参数定义应用实例 typeAliases 别名处理器举例说明 typeHandlers 类型处理器environments 环境environment 属性应用实例 mappers配置 mybatis-config.xml-配置文…...

【雕爷学编程】MicroPython动手做(18)——掌控板之声光传感器

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…...

Ribbon源码

学了feign源码之后感觉&#xff0c;这部分还是按运行流程分块学合适。核心组件什么的&#xff0c;当专业术语学妥了。序章&#xff1a;认识真正のRibbon 但只用认识一点点 之前我们学习Ribbon的简单使用时&#xff0c;都是集成了Eureka-client或者Feign等组件&#xff0c;甚至在…...

Linux下在终端输入密码隐藏方法

Linux系统中&#xff0c;如何将在终端输入密码时将密码隐藏&#xff1f; 最近做简单的登录界面时&#xff0c;不做任何操作的话&#xff0c;在终端输入密码的同时也会显示输入的密码是什么&#xff0c;这样对于隐蔽性和使用都有不好的体验。那么我就想到将密码用字符*隐藏起来…...

【ARM 常见汇编指令学习 3 -- ARM64 无符号位域提取指令 UBFX】

文章目录 ARM64 无符号位域提取指令 上篇文章&#xff1a;ARM 常见汇编指令学习 2 – 存储指令 STP 与 LDP 下篇文章&#xff1a;ARM 常见汇编指令学习 4 – ARM64 比较指令 cbnz 与 b.ne 区别 ARM64 无符号位域提取指令 在代码中如何监控寄存器的某1bit&#xff0c; 或者某几…...

求分享如何批量压缩视频的容量的方法

视频内存过大&#xff0c;不但特别占内存&#xff0c;而且还会使手机电脑出现卡顿的现象&#xff0c;除此之外&#xff0c;如果我们想发送这些视频文件可能还会因为内存太大无法发送。因此&#xff0c;我们可以批量地压缩视频文件的内存大小&#xff0c;今天小编要来分享一招&a…...

ChatGPT 是如何工作的:从预训练到 RLHF

欢迎来到人工智能的未来&#xff1a;生成式人工智能&#xff01;您是否想知道机器如何学习理解人类语言并做出相应的反应&#xff1f;让我们来看看ChatGPT ——OpenAI 开发的革命性语言模型。凭借其突破性的 GPT-3.5 架构&#xff0c;ChatGPT 席卷了世界&#xff0c;改变了我们…...

KafKa脚本操作

所有操作位于/usr/local/kafka_2.12-3.5.1/bin。 rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# pwd /usr/local/kafka_2.12-3.5.1/bin rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# ls connect-distributed.sh kafka-delegation-tokens.sh kafka-mirror-mak…...

【自动化运维】playbook剧本

目录 一、Ansible 的脚本 playbook 剧本1.1playbooks的组成 二、剧本编写实验2.1定义、引用变量2.2使用远程主机sudo切换用户2.3whenn条件判断2.4迭代 三、Templates 模板四、Tags模板 一、Ansible 的脚本 playbook 剧本 1.1playbooks的组成 &#xff08;1&#xff09;Tasks&…...

java中双引号和单引号的区别

起因 刷题的时候&#xff0c;有判断是否相同的情况&#xff0c;然后我发现单引号和双引号在上的表现不一样&#xff0c;所以记录一下。 解释 在Java中&#xff0c;双引号&#xff08;" "&#xff09;和单引号&#xff08;’ &#xff09;在使用上有很重要的区别&a…...

jenkinsfile指定jenkins流水线的构建号

背景 升级Jenkins过程中不小心导致流水线配置文件job目录丢失, 重新配置流水线后所有流水线构建号码都从1开始构建了, 然而我们的产品关联了jenkins构建号,重新从1 构建会导致各种问题. 解决方案 在Jenkinsfile文件中指定流水线的构建号为一个不存在的数字, 这样就不会冲突了…...

微信小程序:实现提示窗确定,取消执行不同操作(消息提示确认取消)showModal

效果 代码 wx.showModal({title: 提示,content: 是否确认退出,success: function (res) {if (res.confirm) {console.log(用户点击确定)} else if (res.cancel) {console.log(用户点击取消)}}})...

深度学习论文: Q-YOLO: Efficient Inference for Real-time Object Detection及其PyTorch实现

深度学习论文: Q-YOLO: Efficient Inference for Real-time Object Detection及其PyTorch实现 Q-YOLO: Efficient Inference for Real-time Object Detection PDF: https://arxiv.org/pdf/2307.04816.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代…...

解读随机森林的决策树:揭示模型背后的奥秘

一、引言 随机森林[1]是一种强大的机器学习算法&#xff0c;在许多领域都取得了显著的成功。它由多个决策树组成&#xff0c;而决策树则是构建随机森林的基本组件之一。通过深入解析决策树&#xff0c;我们可以更好地理解随机森林模型的工作原理和内在机制。 决策树是一种树状结…...

内容力重塑品牌增长:开源AI大模型驱动下的智能名片与S2B2C商城赋能抖音生态种草范式

摘要&#xff1a;内容力已成为抖音生态中品牌差异化竞争的核心能力&#xff0c;通过有价值、强共鸣的内容实现产品"种草"与转化闭环。本文基于"开源AI大模型AI智能名片S2B2C商城小程序源码"技术架构&#xff0c;提出"技术赋能内容"的新型种草范式…...

Java泛型中的通配符详解

无界通配符 通配符的必要性 通过WrapperUtil类的示例可以清晰展示通配符的使用场景。假设我们需要为Wrapper类创建一个工具类WrapperUtil&#xff0c;其中包含一个静态方法printDetails()&#xff0c;该方法需要处理任意类型的Wrapper对象。最初的实现尝试如下&#xff1a; …...

SDC命令详解:使用set_propagated_clock命令进行约束

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目录 指定端口列表/集合 简单使用 注意事项 传播时钟是在进行了时钟树综合后&#xff0c;使用set_propagated_clock命令可以将一个理想时钟转换为传播时钟&#x…...

第23讲、Odoo18 邮件系统整体架构

目录 Odoo 邮件系统整体架构邮件发送方式邮件模板配置SMTP 邮件服务器配置邮件发送过程开发中常见邮件发送需求常见问题排查提示与最佳实践完整示例&#xff1a;审批通过自动发邮件门户表单自动邮件通知案例邮件队列与异步发送邮件添加附件邮件日志与调试多语言邮件模板邮件安…...

html表格转换为markdown

文章目录 工具功能亮点1.核心实现解析1. 剪贴板交互2. HTML检测与提取3. 转换规则设计 2. 完整代码 在日常工作中&#xff0c;我们经常遇到需要将网页表格快速转换为Markdown格式的场景。无论是文档编写、知识整理还是数据迁移&#xff0c;手动转换既耗时又容易出错。本文将介绍…...

网络安全厂商F5推出AI Gateway,化解大模型应用风险

AI正以前所未见的速度重塑数字化体验。然而&#xff0c;企业在加速落地现代化数字体验的过程中&#xff0c;其在保障和交付AI应用方面仍面临严峻挑战。这些应用需处理海量数据&#xff0c;涉及复杂流量模式&#xff0c;并引入更高级的安全威胁&#xff0c;而企业当前的安全能力…...

构建 MCP 服务器:第 4 部分 — 创建工具

这是我们构建 MCP 服务器的四部分教程的最后一部分。在第一部分中&#xff0c;我们使用基本资源创建了第一个 MCP 服务器。第二部分添加了资源模板并改进了代码组织。在第三部分中&#xff0c;我们添加了提示符并进一步完善了服务器结构。现在&#xff0c;我们将通过添加工具来…...

基于LLaMA-Factory和Easy Dataset的Qwen3微调实战:从数据准备到LoRA微调推理评估的全流程指南

随着开源大模型如 LLaMA、Qwen 和 Baichuan 的广泛应用&#xff0c;其基于通用数据的训练方式在特定下游任务和垂直领域中的表现仍存在提升空间&#xff0c;因此衍生出针对具体场景的微调训练需求。这些训练涵盖预训练&#xff08;PT&#xff09;、指令微调&#xff08;SFT&…...

Webhook 配置备忘

本文地址&#xff1a;blog.lucien.ink/archives/552 将下列代码保存为 install.sh&#xff0c;然后 bash install.sh。 #!/usr/bin/env bash set -e wget https://github.mirrors.lucien.ink/https://github.com/adnanh/webhook/releases/download/2.8.2/webhook-linux-amd64.…...

机器学习笔记【Week7】

一、SVM的动机&#xff1a;大间隔分类器 1、逻辑回归回顾 假设函数为 sigmoid 函数&#xff1a; h θ ( x ) 1 1 e − θ T x h_\theta(x) \frac{1}{1 e^{-\theta^Tx}} hθ​(x)1e−θTx1​ 分类依据是 h θ ( x ) ≥ 0.5 h_\theta(x) \geq 0.5 hθ​(x)≥0.5 为正类&a…...