Sanic通过pydantic实现数据验证和标准化输出

POST /users/login 方法提供username和password入参 username要求字符长序6-20之间 ,密码要求字符长度大于8

# main.py主文件添加路由
app.blueprint(Users,url_prefix='/users')

# users.py提供登录方法
from sanic.log import logger
from sanic_ext import validate
from app.entiies.account import Account

Users=Blueprint('users',url_prefix='/')


@Users.post('/login') # username (6-20) password (8-)
@validate(json=Account)
async def login(req:Request,body:Account)->HTTPResponse:
    info=req.json
    logger.info(info)
    return json(info)

uv add sanic_ext # 加入扩展对应的是Account验证方法

pydantic验证  uv add pydantic

from pydantic import BaseModel,model_validator
from sanic.exceptions import SanicException

class Account(BaseModel):
    username:str
    password:str

    @model_validator(mode='before')
    def validators(cls,values):
        username=values.get('username')
        if len(username)<6 or len(username)>20:
            raise SanicException('用户名长度6-20',status_code=400)
        
        pwd=values.get('password')
        if len(pwd)<8:
            raise SanicException('密码长度小于8',status_code=400)
        return values

业务集成标准化输出 {$code,$message}通过middleware实现

在主路由上实现中间件注册

app.register_middleware(middleware=logging,attach_to='response')

from sanic.request import Request
from sanic.response import HTTPResponse,json
from sanic.log import logger
from sanic import text,json 
import json as json2
import uuid



async def logging(req:Request,res:HTTPResponse):
    data=json2.loads(res.body.decode('utf-8'))
    if data['status']==400:
        return json({'code':f'10{data["status"]}','message':data['message'],'req-id':str(uuid.uuid4())},status=400)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恒云客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值