前言
通过前面的学习, 我们已经知道了zdppy_api和zdppy_req的基本用法, 接下来我们会在学习中多次用到这两个框架.
我们已经知道了该如何响应一个字符串,但是我们该如何响应json数据呢?
在zdppy_api中,我们定义了一组规范的API响应, 我们慢慢来看看.
规范的响应
首先来看看底层的一些方法:
def success(
data=None,
msg="success",
code=10000,
):
"""返回成功的响应"""
result = {"msg": msg, "status": True, "code": code}
if data is not None:
result["data"] = data
return JSONResponse(result)
def success_orm_reflect(
model=None,
msg="success",
code=10000,
):
"""响应ORM模型对象"""
if model is None:
return success(None, msg, code)
# 获取数据
data = {}
try:
origin_data = model.__dict__.get("__data__") or {}
response = getattr(model, "__response__")
if response is not None:
new_data = {
k: origin_data.get(k)
for k in response
}
data = new_data
else:
data = origin_data
except Exception as e:
return error_500(str(e))
return success(data, msg, code)
def success_orm(
model=None,
msg="success",
code=10000,
):
"""响应ORM模型对象"""
if model is None:
return success(None, msg, code)
# 获取数据
data = {}
try:
origin_data = model.__dict__.get("__data__") or {}
data = origin_data
except Exception as e:
return error_500(str(e))
try:
response = model._response
if response is not None:
new_data = {
k: data.get(k)
for k in response
}
data = new_data
except:
pass
return success(data, msg, code)
def error(msg="服务器错误", code=10001):
"""服务器错误"""
return JSONResponse({"msg": msg, "status": False, "code": code})
def error_401(msg="权限校验失败", code=10401):
"""权限校验失败"""
return JSONResponse({"msg": msg, "status": False, "code": code})
def error_400(msg="数据处理失败", code=10400):
"""数据处理失败"""
return JSONResponse({"msg": msg, "status": False, "code": code})
def error_402(msg="请求参数校验失败", code=10402):
"""请求参数校验失败"""
return JSONResponse({"msg": msg, "status": False, "code": code})
def error_404(msg="找不到该资源", code=10404):
"""找不到该资源"""
return JSONResponse({"msg": msg, "status": False, "code": code})
def error_501(msg="服务器内部错误", code=10501):
"""服务器内部错误"""
return JSONResponse({"msg": msg, "status": False, "code": code})
def error_500(msg="服务器内部错误", code=10500):
"""服务器内部错误"""
return JSONResponse({"msg": msg, "status": False, "code": code})
def error_mysql(msg="连接mysql失败", code=13306):
"""连接mysql失败"""
return JSONResponse({"msg": msg, "status": False, "code": code})
def error_redis(msg="连接redis失败", code=16379):
"""连接redis失败"""
return JSONResponse({"msg": msg, "status": False, "code": code})
def error_es(msg="连接es失败", code=19200):
"""连接es失败"""
return JSONResponse({"msg": msg, "status": False, "code": code})
内容非常的丰富, 不过不要被吓到了, 实际上我们在工作中常用的只有几个.
我们一个一个来学习一下.
返回成功的响应
我们先来看看服务端的代码.
import zdppy_api as api
async def hello(request):
return api.resp.success()
app = api.Api(
routes=[
api.resp.get("/", hello)
]
)
if __name__ == "__main__":
app.run(port=8888)
这里我们用async def hello(request)
来定义了一个异步的方法, 这个是标准的API接口的写法.
在zdppy_api这个框架中, 所有的接口都是异步的, 都需要用async来标记.
接着就是返回值, 我们返回的是 api.resp.success()
, 这是标准的成功的响应, 返回的是一个JSON数据.
接下来我们来写一个简单的客户端, 看看返回值是什么.
import zdppy_req as req
print(req.get("http://127.0.0.1:8888/").json())
我们之前使用text输出文本类型的数据, 现在使用json()
输出json类型的数据.
客户端输出结果如下:
{'msg': 'success', 'status': True, 'code': 10000}
这是非常标准的成功响应.
我们在真实开发的时候,比如新增成功, 修改成功, 查询成功等等, 都是使用这个响应.
这个响应还支持自定义的数据.
zdppy_rand框架介绍
提到数据, 这里在给大家介绍一个zdppy框架下的开发神器, 也是能够极大的提高我们的开发效率.
那就是zdppy_rand, 这是一个用来生成随机数据的框架.
比如我们要生成20条随机用户的信息, 我们会怎么办呢?
写一堆代码生成随机的姓名, 年龄, 性别还有其他的一些东西?
统统不需要, 使用zdppy_rand, 只需要一行代码就可以搞定.
data = rand.user.list()
是不是超级简单?
哈哈, 我就喜欢简单的东西, 别人说简单, 会让我觉得很有成就感.
返回带数据的响应
那么, 接下来, 我们来编写一个接口, 这个接口能够返回随机的20个用户的信息, 我们来看看有多简单.
实际上我们只需要对之前的代码稍加改造就行了.
接口改为:
async def hello(request):
data = rand.user.list()
return api.resp.success(data)
完整的代码是:
import zdppy_api as api
import zdppy_rand as rand
async def hello(request):
data = rand.user.list()
return api.resp.success(data)
app = api.Api(
routes=[
api.resp.get("/", hello)
]
)
if __name__ == "__main__":
app.run(port=8888)
此时客户端也需要稍加改造, 因为生成的随机用户信息实在是太多了.
我们来改写一下客户端, 遍历返回的每一个用户信息.
import zdppy_req as req
data = req.get("http://127.0.0.1:8888/").json()
for v in data.get("data"):
print(v)
此时的输出结果如下:
我们复制其中一条信息来看看:
{'name': '杜飞文', 'ename': 'cytheria', 'gender': '女', 'age': 43, 'weight': 191.60044071508094, 'height': 159.0499732814901, 'phone': '13314438056', 'email': 'monica@yahoo.com', 'cid': '220822197402161021', 'job': '挂杆复烤工', 'department': '人力资源部', 'salary': 63982.85120517511, 'id': 19}
- name: 姓名
- ename: 英文名
- gender: 性别
- age: 年龄
- weight: 体重
- height: 身高
- phone: 手机号
- email: 邮箱
- cid: 身份证号
- job: 职业
- department: 部门
- salary: 薪资
- id: 唯一编号
返回标准错误信息
除了返回成功的响应, 我们还通常需要对错误信息做处理, zdppy_api还给我们提供了一些标准的错误信息, 我们来看看.
我们写一个接口, 接收用户传入的code, 这个code是不同值的时候返回不同的错误信息.
async def hello(request):
# 获取查询参数
code = api.req.get_query(request, "code")
if code == "1":
return api.resp.error()
elif code == "2":
return api.resp.error_401()
elif code == "3":
return api.resp.error_404()
elif code == "4":
return api.resp.error_500()
elif code == "5":
return api.resp.error_501()
elif code == "6":
return api.resp.error_mysql()
elif code == "7":
return api.resp.error_redis()
return api.resp.success()
对于怎么获取查询参数, zdppy_api也做了封装, 一句代码就可以搞定:
code = api.req.get_query(request, "code")
其他的就是一些常见的错误:
- api.resp.error() : 通用错误
- api.resp.error_401(): 权限错误
- api.resp.error_404(): 数据找不到错误
- api.resp.error_500(): 服务器错误
- api.resp.error_mysql(): MySQL处理错误
- api.resp.error_redis(): redis处理错误
接着, 我们也是使用req框架请求一下试试.
import zdppy_req as req
codes = ["1", "2", "3", "4", "5", "6"]
for code in codes:
print(req.get(f"http://127.0.0.1:8888?code={code}").json())
控制台输出如下:
总结
我们学习了如何返回成功的响应, 成功且带数据的响应, 以及一些标准的常见错误的响应.
这个是做api开发最基础的东西, 我们后面会大量的用到.
到目前为止, 你就算是以及能够使用api开发一些简单的接口了.
此外, 我们还学习了zdppy_rand这个框架的用法, 一行代码就能够生成非常丰富的用户信息, 非常的好用.
但是还是那句话, 这些只是zdppy框架的冰山一角罢了, 我们继续学习, 会发现zdppy这个框架有非常非常多更加强大的东西.
那么, 继续学习吧!!!