flask实现用户名查重,重复的用户名阻止注册,以及如何优化
在 Flask 中实现用户名查重,并阻止重复的用户名进行注册,可以使用数据库(如 SQLite、MySQL、PostgreSQL)存储用户信息,并在注册时检查用户名是否已存在。以下是实现步骤:
1. 安装 Flask 及 SQLAlchemy
确保已安装 Flask 及 Flask-SQLAlchemy:
pip install flask flask-sqlalchemy
2. 创建 Flask 应用并设置数据库
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' # 使用 SQLite
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)# 用户模型
class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)# 初始化数据库
with app.app_context():db.create_all()
3. 实现注册接口,检查用户名是否存在
@app.route('/register', methods=['POST'])
def register():data = request.get_json()username = data.get('username')if not username:return jsonify({'error': '用户名不能为空'}), 400# 查重existing_user = User.query.filter_by(username=username).first()if existing_user:return jsonify({'error': '用户名已存在'}), 409# 创建新用户new_user = User(username=username)db.session.add(new_user)db.session.commit()return jsonify({'message': '注册成功', 'username': username}), 201if __name__ == '__main__':app.run(debug=True)
4. 测试 API
(1) 注册新用户
curl -X POST http://127.0.0.1:5000/register -H "Content-Type: application/json" -d '{"username": "test_user"}'
返回成功
{"message": "注册成功","username": "test_user"
}
(2) 注册相同的用户名
curl -X POST http://127.0.0.1:5000/register -H "Content-Type: application/json" -d '{"username": "test_user"}'
返回错误
{"error": "用户名已存在"
}
总结
- 使用 Flask-SQLAlchemy 进行数据库管理。
- 在注册时通过
User.query.filter_by(username=username).first()
查找是否已有该用户名。 - 如果用户名已存在,返回
409 Conflict
,否则插入新用户。
这样就能有效地防止用户名重复注册!
如果想让用户名查重和注册更高效,可以从以下几个方面优化:
优化方案
- 数据库层级的唯一索引
- 直接在数据库表中给
username
添加唯一索引,让数据库自动处理冲突,避免重复查询。
- 直接在数据库表中给
- 使用事务
- 通过事务处理,确保数据一致性,避免竞态条件导致的重复注册。
- 缓存+数据库双层校验
- 使用 Redis 缓存用户名,提高查询效率,减少数据库压力。
1. 使用数据库唯一约束
修改模型,添加唯一索引
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' # SQLite数据库
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)# 用户模型,添加唯一索引
class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False) # 唯一索引# 初始化数据库
with app.app_context():db.create_all()# 注册接口
@app.route('/register', methods=['POST'])
def register():data = request.get_json()username = data.get('username')if not username:return jsonify({'error': '用户名不能为空'}), 400try:new_user = User(username=username)db.session.add(new_user)db.session.commit() # 依赖数据库的唯一索引,避免重复插入return jsonify({'message': '注册成功', 'username': username}), 201except Exception as e:db.session.rollback() # 事务回滚return jsonify({'error': '用户名已存在'}), 409 # 直接返回冲突状态码if __name__ == '__main__':app.run(debug=True)
优化点
- 不手动查重,直接尝试插入,数据库
unique=True
会强制唯一性,减少一次查询。 - 异常处理:如果数据库抛出
IntegrityError
,说明用户名已存在,直接返回409 Conflict
,并回滚事务。
2. 使用 Redis 缓存,提高查重效率
对于高并发场景,频繁查询数据库的效率较低,可以使用 Redis 作为缓存。
安装 Redis 及 Flask-Redis
pip install redis flask-redis
修改代码,增加 Redis 缓存
import redis
from flask_redis import FlaskRedisapp.config['REDIS_URL'] = "redis://localhost:6379/0"
redis_client = FlaskRedis(app)@app.route('/register', methods=['POST'])
def register():data = request.get_json()username = data.get('username')if not username:return jsonify({'error': '用户名不能为空'}), 400# **先查询 Redis 缓存**if redis_client.exists(f"user:{username}"):return jsonify({'error': '用户名已存在'}), 409try:new_user = User(username=username)db.session.add(new_user)db.session.commit()# **插入数据库后更新 Redis 缓存**redis_client.set(f"user:{username}", "1", ex=3600) # 缓存1小时return jsonify({'message': '注册成功', 'username': username}), 201except Exception as e:db.session.rollback()return jsonify({'error': '用户名已存在'}), 409
优化点
- 先查 Redis,如果 Redis 中已存在该用户名,则直接返回错误,避免查询数据库,提高效率。
- 数据库写入成功后,再更新 Redis 缓存,确保数据一致性。
- Redis 设置过期时间,防止缓存占用过多内存。
性能对比
方案 | 查重方式 | 查询次数 | 适用场景 |
---|---|---|---|
传统方式 | SQL 查询 User.query.filter_by(username=username).first() | 2次(查询+插入) | 低并发场景 |
数据库唯一索引 | 直接插入,依赖 unique=True | 1次(插入失败时回滚) | 中等并发场景 |
Redis + 数据库 | 先查 Redis,Redis 无命中再查数据库 | 最多 1 次数据库查询 | 高并发场景 |
总结
- 普通场景(单机应用):仅使用数据库唯一索引 (
unique=True
),避免额外的 SQL 查询。 - 高并发场景:结合 Redis 缓存,先查 Redis,再查数据库,减少数据库查询压力。
这样就能在保证唯一性的同时,提高性能!
相关文章:
flask实现用户名查重,重复的用户名阻止注册,以及如何优化
在 Flask 中实现用户名查重,并阻止重复的用户名进行注册,可以使用数据库(如 SQLite、MySQL、PostgreSQL)存储用户信息,并在注册时检查用户名是否已存在。以下是实现步骤: 1. 安装 Flask 及 SQLAlchemy 确保…...

ASP.NET Core对JWT的封装
目录 JWT封装 [Authorize]的注意事项 JWT封装 NuGet 库 |Microsoft.AspNetCore.Authentication.JwtBearer 9.0.1https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.JwtBearerhttps://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.JwtBea…...

wordpressAI工具,已接入Deepseek 支持自动生成文章、生成图片、生成长尾关键词、前端AI窗口互动、批量采集等
基于关键词或现有内容生成SEO优化的文章,支持多种AI服务(如OpenAI、百度文心一言、智谱AI等),并提供定时任务、内容采集、关键词生成等功能。 核心功能 文章生成 关键词生成:根据输入的关键词生成高质量文章。 内容…...
Ollama部署 DeepSeek-R1:70B 模型的详细步骤
1. 确认环境准备 (1) 硬件要求 显存需求:70B 参数的模型需要大量显存。若使用 NVIDIA T4(16GB 显存),需多卡并行(如 8 卡)或开启量化(如 q4_0、q8_0)。内存需求:建议至…...

PAT乙级( 1009 说反话 1010 一元多项式求导)C语言版本超详细解析
1009 说反话 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母&#x…...

学习笔记十九:K8S生成pod过程
K8S生成pod过程 流程图具体生成过程用户提交 Pod 定义API Server 处理请求调度器分配节点(Scheduling)目标节点上的 Pod 创建网络配置状态上报与监控控制器管理(Controller Manager)就绪与服务发现 关键错误场景高级特性 流程图 具…...
Qwen2-VL:增强视觉语言模型对世界任意分辨率的感知能力
1、摘要 Qwen2-VL系列是Qwen-VL模型的高级升级版本,它重新定义了传统视觉处理中预设分辨率的方法。Qwen2-VL引入了Naive Dynamic Resolution机制,使模型能够动态处理不同分辨率的图像,并将其转换为不同数量的视觉标记。这种机制使模型能够生…...

原神新版本角色牌上新 七圣召唤增添新玩法
在原神这款游戏中,5.4版本更新后七圣召唤玩法将新增2张角色牌和对应天赋牌、3张行动牌,并进行部分卡牌平衡调整,今天就给大家介绍一下。 一、角色牌【基尼奇】 1.元素战技:选一个我方角色,自身附属钩索链接并进入夜魂…...
Spring 中的 事务 隔离级别以及传播行为
1. 事务隔离级别(Isolation Level) 事务隔离级别定义了事务在并发环境下的行为,主要解决以下问题: 脏读(Dirty Read):一个事务读取了另一个未提交事务的数据。 不可重复读(Non-Re…...
为多个GitHub账户配置SSH密钥
背景 当需要同时使用多个GitHub账户(例如工作和个人账户)时,默认的SSH配置可能导致冲突。本文介绍如何通过生成不同的SSH密钥对并配置SSH客户端来管理多个账户。 操作步骤 生成SSH密钥对 为每个GitHub账户生成独立的密钥对,并指…...

OSPF基础(3):区域划分
OSPF的区域划分 1、区域产生背景 路由器在同一个区域中泛洪LSA。为了确保每台路由器都拥有对网络拓扑的一致认知,LSDB需要在区域内进行同步。OSPF域如果仅有一个区域,随着网络规模越来越大,OSPF路由器的数量越来越多,这将导致诸…...
android studio无痛入门
在Android Studio中创建和管理项目主要涉及以下几个步骤: 1. 创建新项目 打开Android Studio,点击“Start a new Android Studio project”或者“File” > “New” > “New Project”。 选择一个模板,例如“Empty Activity”࿰…...

免费windows pdf编辑工具Epdf
Epdf(完全免费) 作者:不染心 时间:2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器,目前仍在开发中。它提供了一系列实用的命令行选项,方便用户对 PDF …...

CNN 卷积神经网络处理图片任务 | PyTorch 深度学习实战
前一篇文章,学习率调整策略 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started CNN 卷积神经网络 CNN什么是卷积工作原理深度学习的卷积运算提取特征不同特征核的效果比较卷积核感受野共享权重池化 示例源码 …...
LeetCode 128: 最长连续序列
LeetCode 128: 最长连续序列 题目: 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums […...

大语言模型需要的可观测性数据的关联方式
可观测性数据的关联方式及其优缺点 随着现代分布式架构和微服务的普及,可观测性(Observability)已经成为确保系统健康、排查故障、优化性能的重要组成部分。有效的可观测性数据关联方式不仅能够帮助我们实时监控系统的运行状态,还…...

【韩顺平linux】部分上课笔记整理
整理一下一些韩顺平老师上课时候的笔记 课程:【小白入门 通俗易懂】韩顺平 一周学会Linux linux环境:使用阿里云服务器 笔记参考 : [学习笔记]2021韩顺平一周学会Linux 一、自定义函数 基本语法 应用实例: 计算两个参数的和…...
python调用pc的语音借口
先安装: pip install pyttsx3再运行: import pyttsx3 # 初始化语音引擎 def init_engine():engine pyttsx3.init()# 设置中文语音voices engine.getProperty(voices)for voice in voices:if chinese in voice.name.lower():engine.setProperty(voice…...
【Golang学习之旅】Golang 内存管理与 GC 机制详解
文章目录 前言1. Go 语言的内存管理的简述2. Golang 内存管理机制2.1 Go 语言的内存分配模型2.2 Go 变量分配示例2.3 Go 语言的内存池(sync.Pool) 3. Golang 垃圾回收(GC)机制详解3.1 Go 的 GC 机制概述3.2 GC 触发条件3.3 手动触…...
Kamailio 各个功能的共同点、不同点及应用场景
Kamailio 各个功能的共同点、不同点及应用场景: 功能共同点不同点应用场景SIP 注册服务器处理用户注册请求,维护用户位置信息专注于用户设备的注册和注销,维护设备位置企业内部通信系统,确保用户设备的动态注册和注销SIP 代理服务…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...