前言
前面我们已经接入了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一同返回。