FastAPI(六十六)实战开发《在线课程学习系统》接口开发--用户注册接口开发
在前面我们分析了接口的设计,那么我们现在做接口的开发。
我们先去设计下pydantic用户参数的校验
from pydantic import BaseModel from typing import Optional class UserBase(BaseModel): username: str class UserCreate(UserBase): """ 请求模型验证: username: password: """ password: str role: int jobnum: Optional[int] = None studentnum: Optional[int] = None sex: str = "男" age: int
接着,我们去设计对应的crud,操作对应的数据库。
from sqlalchemy.orm import Session from models.models import * from models.schemas import * def get_user(db: Session, user_id: int): return db.query(User).filter(User.id == user_id,User.status==False).first() # 新建用户 def db_create_user(db: Session, user: UserCreate): roles = db.query(Role).filter(Role.name == user.role).first() db_user = User(**user.dict()) db_user.role=roles.id db.add(db_user) db.commit() # 提交保存到数据库中 db.refresh(db_user) # 刷新 return db_user def get_user_username(db: Session, username: str): return db.query(User).filter(User.username == username,User.status==False).first()
接下来,我们看下注册接口的逻辑
1.校验参数是否合规 2.查询用户名是否存在 3.密码加密 4.保存到数据库
我们根据我们的逻辑去开发我们的接口。
from fastapi import APIRouter, Request from fastapi import Depends, HTTPException, Header from models.crud import * from models.get_db import get_db from jose import JWTError, jwt from passlib.context import CryptContext from config import * from common.jsontools import * from common.logs import logger usersRouter = APIRouter() 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) # 新建用户 @usersRouter.post("/create", tags=["users"]) def create_user(user: UserCreate, db: Session = Depends(get_db)): logger.info("创建用户") if len(user.username)<8 or len(user.username)>16: return reponse(code=100106,message="用户名长度应该是8-16位",data="") if user.age<18: return reponse(code=100103, message="年纪大小不符合", data="") if (user.role == "学生" and user.studentnum is None) or (user.role == "教师" and user.jobnum is None) or ( user.role not in ["教师", '学生']): return reponse(code=100102, message="身份和对应号不匹配", data="") db_crest = get_user_username(db, user.username) if db_crest: return reponse(code=100104, message="用户名重复", data="") try: user.password = get_password_hash(user.password) except Exception as e: logger.exception(e) return reponse(code=100105, data="", message="密码加密失败") try: user=db_create_user(db=db, user=user) logger.success("创建用户成功") return reponse(code=200,data={'user':user.username},message="success") except Exception as e: logger.exception(e) return reponse(code=100101, data="", message="注册失败")
在启动的时候,我们需要在main.py下注册对应的路由。
from fastapi import FastAPI from routers.user import usersRouter app = FastAPI() app.include_router(usersRouter, prefix="/user", tags=['users'])
然后对应的启动的
这样我们就完成了注册的接口的开发。这里的知识点用到了jose,passlib,这里如果不太熟悉,可以查看FastAPI 学习之路(三十)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2
分类:
fastapi
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?