签入版本
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
# 统一响应封装(R 对象)
|
||||
|
||||
:::tip 说明
|
||||
`src/core/response.py` 提供统一的 API 响应封装,所有接口返回格式为 `{code, data, msg, ok}`。R 对象是全局统一的响应工具类。
|
||||
:::
|
||||
|
||||
## 响应格式
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"data": {},
|
||||
"msg": "操作成功",
|
||||
"ok": true
|
||||
}
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|:-----|:-----|:-----|
|
||||
| `code` | int | 状态码:0=成功,非0=失败 |
|
||||
| `data` | any | 响应数据 |
|
||||
| `msg` | string | 提示信息 |
|
||||
| `ok` | bool | 是否成功 |
|
||||
|
||||
## R 对象方法
|
||||
|
||||
### R.ok — 成功响应
|
||||
|
||||
```python
|
||||
from core import response as R
|
||||
|
||||
# 基本成功
|
||||
R.ok(handler)
|
||||
|
||||
# 带数据
|
||||
R.ok(handler, data={"id": 1, "name": "admin"})
|
||||
|
||||
# 自定义消息
|
||||
R.ok(handler, msg="注册成功")
|
||||
|
||||
# 带分页
|
||||
R.ok(handler, data={"list": [...], "total": 100})
|
||||
```
|
||||
|
||||
### R.failed — 失败响应
|
||||
|
||||
```python
|
||||
# 基本失败
|
||||
R.failed(handler)
|
||||
|
||||
# 自定义消息
|
||||
R.failed(handler, msg="用户名已存在")
|
||||
|
||||
# 自定义状态码
|
||||
R.failed(handler, code=401, msg="未授权")
|
||||
```
|
||||
|
||||
### R.response — 自定义响应
|
||||
|
||||
```python
|
||||
# 完全自定义
|
||||
R.response(handler, code=0, data={}, msg="自定义", ok=True)
|
||||
```
|
||||
|
||||
## 实现原理
|
||||
|
||||
```python
|
||||
# src/core/response.py
|
||||
from core.base_handler import BaseHandler
|
||||
|
||||
class R:
|
||||
@staticmethod
|
||||
def ok(handler: BaseHandler, data=None, msg="操作成功"):
|
||||
handler.finish({
|
||||
"code": Codes.SUCCESS,
|
||||
"data": data,
|
||||
"msg": msg,
|
||||
"ok": True,
|
||||
})
|
||||
|
||||
@staticmethod
|
||||
def failed(handler: BaseHandler, msg="操作失败", code=Codes.FAILED):
|
||||
handler.finish({
|
||||
"code": code,
|
||||
"data": None,
|
||||
"msg": msg,
|
||||
"ok": False,
|
||||
})
|
||||
|
||||
@staticmethod
|
||||
def response(handler: BaseHandler, code=0, data=None, msg="", ok=True):
|
||||
handler.finish({
|
||||
"code": code,
|
||||
"data": data,
|
||||
"msg": msg,
|
||||
"ok": ok,
|
||||
})
|
||||
```
|
||||
|
||||
## Codes 状态码
|
||||
|
||||
```python
|
||||
class Codes:
|
||||
SUCCESS = 0 # 成功
|
||||
FAILED = 1 # 业务失败
|
||||
UNAUTHORIZED = 401 # 未授权
|
||||
FORBIDDEN = 403 # 无权限
|
||||
NOT_FOUND = 404 # 资源不存在
|
||||
SERVER_ERROR = 500 # 服务器错误
|
||||
```
|
||||
|
||||
## 使用规范
|
||||
|
||||
### Handler 层使用
|
||||
|
||||
```python
|
||||
class LinkDetailHandler(BaseHandler):
|
||||
@permission_required("sys:link:detail")
|
||||
async def get(self, id):
|
||||
# Service 返回原始数据时,用 R.ok 包装
|
||||
return R.ok(self, data=link_service.get_detail(id))
|
||||
```
|
||||
|
||||
### Service 层使用
|
||||
|
||||
```python
|
||||
class LinkService(BaseService):
|
||||
async def add(self, handler):
|
||||
# Service 返回 R 对象
|
||||
# ...
|
||||
return R.ok(handler, msg="添加成功")
|
||||
```
|
||||
|
||||
### 异常处理中的使用
|
||||
|
||||
```python
|
||||
# src/core/base_handler.py
|
||||
def write_error(self, status_code, **kwargs):
|
||||
exc = kwargs.get("exc_info", (None, None, None))[1]
|
||||
if isinstance(exc, BaseAppError):
|
||||
self.finish({"code": exc.code, "data": None, "msg": exc.msg, "ok": False})
|
||||
```
|
||||
|
||||
## 与 Tornado 的区别
|
||||
|
||||
| 方面 | 说明 |
|
||||
|:-----|:-----|
|
||||
| 响应方式 | `R.ok(self, data=...)` / `R.failed(self, msg=...)` |
|
||||
| 底层实现 | `self.finish(body)` 写出 JSON |
|
||||
| Handler 参数 | `self`(Handler 实例) |
|
||||
|
||||
## 总结
|
||||
|
||||
R 对象是统一响应封装的核心工具,所有 API 返回 `{code, data, msg, ok}` 格式。成功用 `R.ok()`,失败用 `R.failed()`,自定义用 `R.response()`。Handler 层直接调用 `R.ok(self, data=...)` 完成响应。
|
||||
Reference in New Issue
Block a user