当前位置: 首页 > 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;我们可以更好地理解随机森林模型的工作原理和内在机制。 决策树是一种树状结…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...