基于FastApi框架测试平台(5)-实现登录接口

720 阅读2分钟

前言

前面我们已经接入了sqlalchemy,并且在服务层实现了登录的核心功能,同时还了解了迁移数据操作,这样model变更可以方便的同步数据库。接下来,我们就实现登录接口。

统一错误码

笔者这里根据阿里巴巴Java开发手册进行了错误码整理

common/error_code.py

from pydantic import BaseModel
​
"""
 * 阿里巴巴Java开发手册-黄山版
 * 错误码:
 * 1. 五位组成
 * 2. A代表用户端错误
 * 3. B代表当前系统异常
 * 4. C代表第三方服务异常
"""
​
​
class ErrorBase(BaseModel):
    code: str = ""
    msg: str = ""
​
​
SUCCESS_OK = ErrorBase(code="00000", msg="ok")
​
USER_ERROR_0001 = ErrorBase(code="A0001", msg="用户端错误")
USER_ERROR_A0100 = ErrorBase(code="A0100", msg="用户注册错误")
USER_ERROR_A0110 = ErrorBase(code="A0110", msg="用户名校验失败")
......

定义的错误码比较多,具体也可以查看阿里巴巴Java开发手册中错误码的定义

封装响应

统一接口响应格式,提高编写效率,我们这里对响应内容进行了封装

commom/resp.py

class RespJsonBase(BaseModel):
    code: int | str
    msg: str
    data: dict | list
​
​
def resp_success(data: list | dict | str = None, msg: str = "Success"):
    """ 接口成功返回 """
    return JSONResponse(
        status_code=status.HTTP_200_OK,
        content=RespJsonBase(code=0, msg=msg, data=data or {}).dict()
    )
​
​
def resp_error(error: ErrorBase, *, msg: str | None = None, msg_append: str = "",
               data: list | dict | str = None, status_code: int = status.HTTP_200_OK):
    """ 接口错误返回 """
    return JSONResponse(
        status_code=status_code,
        content=RespJsonBase(code=error.code, msg=(msg or error.msg) + msg_append, data=data or {}).dict()
    )

响应model返回指定字段

def resp_model(schema, model):
    if isinstance(model, list):
        return [schema(**m.__dict__).dict() for m in model]
    else:
        return schema(**model.__dict__).dict()

登录接口

api/v1/user.py

@router.post("/login")
def login(user: user_schema.UserCreate):
    user, err = UserService.login(user.username, user.password)
    if err is not None:
        return resp_error(USER_ERROR_A0200, msg=err)
    return resp_success(resp_model(user_schema.User, user), msg="登录成功")

这样一个简单的登录接口就实现了,我们启动服务,请求登录接口

{
    "code": 0,
    "msg": "登录成功",
    "data": {
        "username": "admin",
        "id": 1
    }
}

哈哈,成功啦。

后续可以加上token一同返回。