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