FastAPI + TortoiseORM 轻量化注册功能实战
完整注册业务链路注册功能采用标准的手机号验证码流程验证码获取阶段前端传入手机号后端校验手机号未注册生成 6 位数字验证码存入 Redis 并设置 2 分钟有效期验证码校验阶段前端提交手机号与验证码后端读取 Redis 缓存完成验证码有效性校验账号创建阶段校验通过后接收用户设置的密码通过 Tortoise-ORM 完成用户数据入库生成 JWT 登录令牌返回前端核心功能轻量化实现本项目聚焦手机号验证码注册核心流程仅保留必需字段与逻辑✅ 手机号验证码注册✅ JWT 令牌生成✅ Redis 缓存验证码❌ 去除头像、邮箱等非核心字段❌ 去除第三方登录等复杂业务fromcontextlibimportasynccontextmanagerfromfastapiimportFastAPI,QueryfrompydanticimportBaseModelfromtortoiseimportTortoise,fieldsfromtortoise.modelsimportModelimportredisimportrandomfromdatetimeimportdatetime,timedeltafromjoseimportjwt# 全局基础配置 # MySQL数据库连接地址根据本地数据库账号密码自行修改MYSQL_URLmysql://root:root127.0.0.1:3306/simple_boss# Redis客户端初始化用于存储短信验证码redis_clientredis.Redis(host127.0.0.1,port6379,db0,decode_responsesTrue)# JWT加密密钥线上项目需更换为复杂随机字符串SECRET_KEYregister-system-secret-key-2026# Tortoise-ORM 数据库模型 classJobUser(Model):求职者用户数据表存储注册账号基础信息idfields.IntField(pkTrue,description用户唯一主键ID)mobilefields.CharField(max_length11,uniqueTrue,description11位手机号全局唯一不可重复)passwordfields.CharField(max_length20,description账号登录密码)create_timefields.DatetimeField(auto_now_addTrue,description账号注册创建时间)classMeta:tablejob_usertable_description求职者注册账号表# Pydantic 请求参数校验模型 # 验证码校验入参模型classCheckCodeReq(BaseModel):mobile:strcode:str# 账号注册提交入参模型classRegisterReq(BaseModel):mobile:strcode:strpassword:str# 通用工具函数 defcreate_sms_code()-str:生成6位纯数字短信验证码return.join(random.choices(0123456789,k6))defcreate_login_token(user_id:int,mobile:str):根据用户ID、手机号生成有效期2小时的JWT登录令牌expire_timedatetime.utcnow()timedelta(hours2)payload{sub:user_id,mobile:mobile,exp:expire_time}tokenjwt.encode(payload,SECRET_KEY,algorithmHS256)returntoken# 业务服务层注册核心业务逻辑 classRegisterService:staticmethodasyncdefsend_register_code(mobile:str): 下发注册场景短信验证码 业务逻辑校验手机号未注册 → 生成验证码 → Redis缓存存储2分钟 # 查询数据库校验手机号是否已完成注册exist_userawaitJobUser.get_or_none(mobilemobile)ifexist_user:raiseException(该手机号已注册账号请直接登录)# 生成6位验证码并存入Rediscodecreate_sms_code()redis_cache_keyfregister_code:{mobile}redis_client.set(redis_cache_key,code,ex120)# 本地调试打印验证码线上项目替换为真实短信服务商接口print(f【注册验证码】手机号{mobile}验证码{code})returnTruestaticmethodasyncdefverify_sms_code(mobile:str,code:str):校验注册场景短信验证码有效性redis_cache_keyfregister_code:{mobile}real_cache_coderedis_client.get(redis_cache_key)ifnotreal_cache_code:raiseException(验证码已过期请重新获取)ifreal_cache_code!code:raiseException(输入的验证码与下发验证码不一致)returnTruestaticmethodasyncdefregister_account(mobile:str,code:str,password:str): 完成账号注册全流程 1. 二次校验验证码有效性 2. 校验手机号不存在防止并发重复注册 3. ORM写入数据库创建用户 4. 清除Redis缓存验证码生成登录令牌 # 第一步校验验证码有效awaitRegisterService.verify_sms_code(mobile,code)# 第二步二次校验手机号规避并发重复注册问题exist_userawaitJobUser.get_or_none(mobilemobile)ifexist_user:raiseException(该手机号已注册账号无法重复注册)# 第三步Tortoise-ORM完成用户数据入库new_userawaitJobUser.create(mobilemobile,passwordpassword)# 第四步清除Redis中已使用的验证码避免复用redis_client.delete(fregister_code:{mobile})# 第五步生成登录令牌返回前端login_tokencreate_login_token(new_user.id,mobile)return{login_token:login_token,user_id:new_user.id,mobile:mobile}# 项目生命周期管理数据库初始化与释放 asynccontextmanagerasyncdeflifespan(app:FastAPI):# 项目启动时初始化数据库连接自动生成数据表awaitTortoise.init(db_urlMYSQL_URL,modules{models:[__main__]})awaitTortoise.generate_schemas()yield# 项目关闭时断开数据库连接释放资源awaitTortoise.close_connections()# 接口路由层对外暴露HTTP接口 appFastAPI(title轻量化注册系统,lifespanlifespan)app.get(/)asyncdefroot():return{message:轻量化注册系统已启动}app.get(/api/register/send-code)asyncdefsend_register_code(mobile:strQuery(...,min_length11,max_length11)): 发送注册验证码接口 - 参数mobile (11位手机号) - 返回发送结果 try:awaitRegisterService.send_register_code(mobile)return{code:200,message:验证码发送成功,data:None}exceptExceptionase:return{code:400,message:str(e),data:None}app.post(/api/register/verify-code)asyncdefverify_register_code(req:CheckCodeReq): 验证码校验接口 - 参数mobile, code - 返回校验结果 try:awaitRegisterService.verify_sms_code(req.mobile,req.code)return{code:200,message:验证码校验成功,data:None}exceptExceptionase:return{code:400,message:str(e),data:None}app.post(/api/register/submit)asyncdefsubmit_register(req:RegisterReq): 提交注册信息接口 - 参数mobile, code, password - 返回注册结果及登录令牌 try:resultawaitRegisterService.register_account(req.mobile,req.code,req.password)return{code:200,message:注册成功,data:result}exceptExceptionase:return{code:400,message:str(e),data:None}

相关新闻

TMS320C672x DSP I2C总线驱动开发:从寄存器配置到硬件设计实践

TMS320C672x DSP I2C总线驱动开发:从寄存器配置到硬件设计实践

1. 项目概述与I2C总线核心价值在嵌入式系统开发,尤其是像TMS320C672x这类高性能浮点DSP的应用中,如何高效、可靠地连接和管理外围芯片是一个永恒的课题。你可能需要连接一个EEPROM来存储配置参数,或者驱动一个音频编解码器(CODEC&…

2026/10/3 7:12:28 阅读更多 →
机器学习损失函数的局限性与工程实践应对策略

机器学习损失函数的局限性与工程实践应对策略

1. 损失函数的本质与局限性 损失函数(Loss Function)是机器学习模型训练过程中最核心的组件之一,它的主要作用是量化模型预测值与真实值之间的差异,并通过优化算法(如梯度下降)来调整模型参数。在传统机器学…

2026/10/9 5:39:23 阅读更多 →
FinBERT金融情感分析实战:从模型部署到交易策略

FinBERT金融情感分析实战:从模型部署到交易策略

1. 项目概述:当金融遇上自然语言处理三年前我在量化基金实习时,基金经理每天开盘前总要花两小时阅读上百条财经新闻。有天他突然问我:"能不能让AI帮我们判断这些新闻是利好还是利空?"这个问题直接催生了这个实战项目——…

2026/10/2 3:37:12 阅读更多 →

最新新闻

工业无机盐科普:无水硫酸钠理化特性与工业应用介绍丨广东大小化工有限公司

工业无机盐科普:无水硫酸钠理化特性与工业应用介绍丨广东大小化工有限公司

无水硫酸钠,是工业生产中非常常见的无机盐原料,属于基础性化工辅料。因为稳定性好、适用性广、杂质可控,被大量应用在轻工、化工、建材、印染等行业。很多工厂日常使用频繁,但对其完整特性与正确储存方式了解不多。一、无水硫酸钠…

2026/10/9 5:38:42 阅读更多 →
FDE深度解析:月薪50-70K·15薪的能力结构及进阶路径,小白程序员必收藏!

FDE深度解析:月薪50-70K·15薪的能力结构及进阶路径,小白程序员必收藏!

本文从薪酬角度解析FDE(Field Data Engineer)岗位的能力要求,50-70K15薪对应行业洞见、技术整合、现场交付、资产沉淀四重能力叠加。FDE承担交付结果,薪资高于传统工程师。文章阐述FDE的进阶路径,从线性增长到资产沉淀…

2026/10/9 5:38:42 阅读更多 →
ThreadLocal系列(四):父子线程信息传递与TTL

ThreadLocal系列(四):父子线程信息传递与TTL

父子线程信息传递与TTL前面介绍了ThreadLocal使用与内存泄漏防范,还从引用队列角度思考如何防范内存泄漏。 这篇文章是自己在实际中用到了RAG检索与回答用自定义线程池而不是tomcat线程池,防止tomcat线程池线程被占用导致无法处理其他请求。 其中用到了跨…

2026/10/9 5:38:42 阅读更多 →
园区网关表免集中器怎么接?4G 母表带子表拓扑

园区网关表免集中器怎么接?4G 母表带子表拓扑

园区网关表,通常指的是一台带 4G 上行的母表,经 RS485 带多台子表、替现场省掉独立集中器的方案。该方案适用于楼栋集中、不想动原有布线的老旧园区。摘要:本文介绍园区网关表方案——以一台带 4G 上行的母表经 RS485 带多台子表,…

2026/10/9 5:38:42 阅读更多 →
软件测试与开发:思维模式、技术栈及职业发展的深度对比

软件测试与开发:思维模式、技术栈及职业发展的深度对比

1. “测试就是点点点”这句话,坑了多少人我在这个行业里待了十几年,见过不少刚入行的新人,也带过不少团队。一个特别有意思的现象是:很多开发同学对测试工作的认知,基本停留在“他们就是点点点,找找bug&…

2026/10/9 5:38:42 阅读更多 →
民心与文脉:穿透华夏千年兴衰的终极密码

民心与文脉:穿透华夏千年兴衰的终极密码

摘要 纵观华夏千年王朝更迭与近代势力兴衰,战争胜负、兵力强弱、疆域大小并非政权成败的核心决定因素。 真正决定历史走向的恒定规律,在于政权是否顺应底层民心、是否扎根华夏本土文脉。 本文以近代多方势力兴衰为样本,逐条拆解历史轮回底层…

2026/10/9 5:37:41 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →