在前面我們分析了接口的設計,那么我們現在做接口的開發。
我們先去設計下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