FastAPI(六十六)实战开发《在线课程学习系统》接口开发--用户注册接口开发

在前面我们分析了接口的设计,那么我们接下来做接口的开发。

首先,我们先设计下pydantic用户参数的校验:

"""
-*- encoding=utf-8 -*-
Time: 2024/7/19 16:48
Author: lc
Email: 15101006331@163.com
File: schemas.py
"""
from pydantic import BaseModel, Field
from typing import Optionalfrom common.constant import SexEnum, RoleEnumclass UserBase(BaseModel):username: str = Field(min_length=8, max_length=16)class UserCreate(UserBase):"""请求验证模型"""password: str = Field(min_length=8, max_length=16)role: RoleEnumjob_num: Optional[str] = Field(None, min_length=8, max_length=8)student_num: Optional[str] = Field(None, min_length=16, max_length=16)sex: SexEnumage: int = Field(ge=18, le=65)

因为role和sex的值是固定的,所以我创建了两个枚举类来限制这两个字段

"""
-*- encoding=utf-8 -*-
Time: 2024/7/22 10:24
Author: lc
Email: 15101006331@163.com
File: constant.py
"""
from enum import Enumclass SexEnum(str, Enum):male = "男"female = "女"class RoleEnum(str, Enum):student = "学生"teacher = "老师"

接着,我设计了注册/新增用户的主要逻辑

"""
-*- encoding=utf-8 -*-
Time: 2024/7/22 10:06
Author: lc
Email: 15101006331@163.com
File: user.py
"""from sqlalchemy.orm import Session
from passlib.context import CryptContext
from traceback import format_excfrom models.models import *
from models.user_schema import *
from common.json_tools import *
from common.log import loggerdef get_user(db: Session, user_id: int):return db.query(User).filter(User.id == user_id, User.status == 0).first()def db_create_user(db: Session, user: UserCreate):logger.info("创建用户开始")db_user = get_by_username(db, user.username)if db_user:return response(code=100104, message="用户名已存在")if (user.role == "学生" and user.student_num is None) or (user.role == "老师" and user.job_num is None):return response(code=100102, message="身份和对应号不匹配")try:user.password = get_password_hash(user.password)except:logger.warning(f"method db_create_user error: {format_exc()}")return response(code=100105, message="密码加密失败")user_to_db = User(**user.dict())db_role = db.query(Role).filter(Role.name == user.role.value).first()user_to_db.role = db_role.idtry:db.add(user_to_db)db.commit()  # 提交保存到数据库db.refresh(user_to_db)  # 刷新logger.info(f"创建用户:‘{user.username}’成功")except:logger.warning(f"method db_create_user error: {format_exc()}")return response(code=100101, message="注册失败,请重试")return response(code=200, data=user_to_db.username)def get_by_username(db: Session, username: str):return db.query(User).filter(User.username == username, User.status == 0).first()pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")def verify_password(plain_password, hashed_password):return pwd_context.verify(plain_password, hashed_password)def get_password_hash(password):return pwd_context.hash(password)

接下来,我们看下注册接口的逻辑

1.校验参数是否合规(这里我使用的pydantic自身的校验,见user_schemas)

2.判断用户名是否已存在

3.加密密码

4.保存到数据库

其次,我在models中新增了初始化roles的方法,并将该方法加入到了startup中间件中,每次启动程序都会检查是否要初始化该数据

def init_roles():from middlewares.mysql.database import SessionLocaldb = SessionLocal()exists = db.query(Role).all()if exists:print("roles already init")returnfor index, sex in enumerate(("老师", "学生")):role = Role(id=index+1, name=sex)db.add(role)db.commit()db.refresh(role)db.close()

@app.on_event("startup")
async def startup_event():app.state.redis = await create_redis()print("init redis success")create_tables()print("init database success")init_roles()print("init roles success")

然后我们要实现注册接口:

"""
-*- encoding=utf-8 -*-
Time: 2024/7/22 09:59
Author: lc
Email: 15101006331@163.com
File: user.py
"""
from fastapi import APIRouter
from fastapi import Dependsfrom methods.user_method import *
from middlewares.mysql.database import create_db
from methods.user_method import db_create_useruser_router = APIRouter()@user_router.post("/", summary="创建用户")
def create_user(user: UserCreate, db: Session = Depends(create_db)):return db_create_user(db, user)

最后,我们要把新增的路由注册到main中的app。

from models.models import create_tables, init_roles
from routers.user import user_routerapp.include_router(user_router, prefix="/user", tags=["users"])

测试:

 

 

到这里我们基本完成了注册接口的开发,使用 到了知识点passlib。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/381350.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机的智能医疗监护系统设计

1.简介 随着社会的发展,智能化电子设备成为了人们生活中不可或缺的一部分,尤其是在人们对于身心健康更加注重的今天,智能医疗监护系统应运而生。本套电子监护设备集体温测量、心电采集、心率监测、血氧监测于一体,带有语音播报模块…

Thinkphp开发文档二次整理版

基础部分 安装 环境要求 ​ *php>7.1.0 命令下载 通过Composer进行下载,操作步骤下载软件 phpstudy --->点击软件管理 --->安装Composer --->再点击网站 --->点击管理 --->点击Composer --->复制如下命令代码: ​ 稳定版&…

甄选范文“论面向方面的编程技术及其应”,软考高级论文,系统架构设计师论文

论文真题 针对应用开发所面临的规模不断扩大、复杂度不断提升的问题,面向方面的编程(Aspect Oriented Programming,AOP)技术提供了一种有效的程序开发方法。为了理解和完成一个复杂的程序,通常要把程序进行功能划分和封装。一般系统中的某些通用功能,如安全性、持续性、日…

构建高效Node.js中间层:探索请求合并转发的艺术

🎉 博客主页:【剑九 六千里-CSDN博客】 🎨 上一篇文章:【CSS盒模型:掌握网页布局的核心】 🎠 系列专栏:【面试题-八股系列】 💖 感谢大家点赞👍收藏⭐评论✍ 引言&#x…

Java-Stream流

流 不同的数据有不同的方式得到其stream 单列集合&#xff1a;使用Collection中的默认方法&#xff1a;default Stream<E> stream双列集合&#xff1a;没有直接获取stream的方法&#xff0c;只能把他转化为单列集合数组&#xff1a;Arrays中的静态方法&#xff1a;publ…

SpringCloud的认识和初步搭建

目录 一.认识SpringCloud 二.SpringCloud的部署 2.1开发环境 2.2数据库的建立 2.3SpringCloud的部署 第一步&#xff1a; 创建Maven项目 第二步&#xff1a;完善pom文件 第三步&#xff1a;创建两个子项目 第四步&#xff1a;声明项目依赖以及构建插件 第五步&#xf…

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker)

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker) 本文档详细介绍了在 Ubuntu Server 22.04 上使用 Docker 安装和配置 NVIDIA Container Toolkit 的过程。 概述 NVIDIA 容器工具包使用户能够构建和运行 GPU 加速容器。即可以在容器中使用NVIDIA显卡。 架构图如…

JVM基本知识——运行空间

JVM&#xff08;Java Virtual Machine&#xff09;即Java虚拟机&#xff0c;是负责读取java字节码&#xff0c;并在实际的硬件环境中运行。 JVM可以分为三部分&#xff1a;类装载器&#xff08;ClassLoader&#xff09;子系统、内存空间、执行引擎 内存空间&#xff08;运行时…

防火墙--双机热备

目录 双击热备作用 防火墙和路由器备份不同之处 如何连线 双机 热备 冷备 VRRP VGMP&#xff08;华为私有协议&#xff09; 场景解释 VGMP作用过程 主备的形成场景 接口故障的切换场景 整机故障 原主设备故障恢复的场景 如果没有开启抢占 如果开启了抢占 负载分…

Debian Linux下rclone挂载谷歌云盘碰到的坑

可能是明月好久没有使用境外服务器挂载境外的云盘缘故吧,今天一个代维客户需要他的Linux服务器挂载谷歌云盘好进行云备份,本来是个很简单的事儿,没想到在rclone连接谷歌云盘的时候卡壳了,可是把明月给难为坏了,搜索到的简体中文教程倒是很多,但没有一个提到这个“坑”,最…

MySQL学习记录 —— 이십삼 MySQL服务器文件系统(3)

文章目录 1、数据字典2、系统表各种系统表 Mysql Schema是⼀个系统库&#xff0c;表中存储了MySQL服务器运行时所需的信息。广义上&#xff0c;mysql schema包含存储MySQL程序基本数据的数据字典和用于其他操作目的的系统表。数据字典表和系统表位于数据目录下一个名为mysql.ib…

数据结构初阶(c语言)-双向链表

这里首先纠正上篇文章一个错误&#xff0c;链表的一个有效数据点应该称为结点而不是节点。 一&#xff0c;双向链表的概念与结构 1.1概念与结构示意图 我们所说的双向链表全称为带头双向循环链表&#xff0c;也就是说此链表带有哨兵位结点(不存放任何数据的结点&#xff0c;且…

简单实用的企业舆情安全解决方案

前言&#xff1a;企业舆情安全重要吗&#xff1f;其实很重要&#xff0c;尤其面对负面新闻&#xff0c;主动处理和应对&#xff0c;可以掌握主动权&#xff0c;避免股价下跌等&#xff0c;那么如何做使用简单实用的企业舆情解决方案呢&#xff1f; 背景 好了&#xff0c;提取词…

Qt Style Sheets-设计器集成

设计器集成 Qt Designer&#xff08;Qt Designer&#xff09;是一个出色的工具&#xff0c;用于预览样式表。您可以在 Designer 中右键单击任何小部件&#xff0c;并选择“更改样式表...”来设置样式表。 在 Qt 4.2 及更高版本中&#xff0c;Qt Designer 还包括一个样式表语法…

洗地机什么牌子好?洗地机排行榜前十名推荐

在追求高效与便捷的现代生活中&#xff0c;洗地机已成为家居清洁不可或缺的智能助手。面对市场上琳琅满目的品牌与型号&#xff0c;洗地机什么牌子好成为很多人选购前的疑问。本篇文章将为您精心推荐洗地机排行榜前十名的知名品牌&#xff0c;包括希亦、追觅、添可等&#xff0…

《0基础》学习Python——第二十三讲__网络爬虫/<6>爬取哔哩哔哩视频

一、在B站上爬取一段视频&#xff08;B站视频有音频和视频两个部分&#xff09; 1、获取URL 注意&#xff1a;很多平台都有反爬取的机制&#xff0c;B站也不例外 首先按下F12找到第一条复制URL 2、UA伪装&#xff0c;下列图片中&#xff08;注意代码书写格式&#xff09; 3、Co…

【效率提升】程序员常用Shell脚本

文章目录 常用Shell脚本一. 定期更新分区数据二、获取系统资源的使用情况 常用Shell脚本 一. 定期更新分区数据 在某些场景下&#xff0c;我们需要对N年前某一分区的数据进行删除&#xff0c;并添加今年该对应分区的数据&#xff0c;实现数据的流动式存储。 #!/bin/bash dt$…

前端-模拟请求数据mook第三方插件 json-server的使用

大纲 第一步下载第二配置mook的数据源第三配置启动命令第四运行模拟服务第五测试接口如果要进行更复杂的操作 第一步下载 npm install json-server -D"devDependencies": {"json-server": "^1.0.0-beta.1"}第二配置mook的数据源 在项目的根目录…

如何在Ubuntu上安装并启动SSH服务(Windows连接)

在日常的开发和管理工作中&#xff0c;通过SSH&#xff08;Secure Shell&#xff09;连接到远程服务器是一个非常常见的需求。如果你在尝试通过SSH连接到你的Ubuntu系统时遇到了问题&#xff0c;可能是因为SSH服务未安装或未正确配置。本文将介绍如何在Ubuntu上安装并启动SSH服…

macOS 10.15中屏蔽Microsoft Edge浏览器的更新提示

文章目录 1.效果对比2.安装描述文件3.停用描述文件4.高级操作&#xff08;可选&#xff09;参考文献 最近在macOS10.15系统&#xff0c;打开Microsoft Edge浏览器&#xff0c;每次打开都有个烦人的提示“ 要获取将来的 microsoft edge 更新&#xff0c;需要 macos 10.15 或更高…