国产低代码框架zdppy开发笔记002 标准的接口响应

前言

通过前面的学习, 我们已经知道了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这个框架有非常非常多更加强大的东西.

那么, 继续学习吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/945329.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实用技巧:关于 AD修改原理图库如何同步更新到有原理图 的解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/144738332 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

牛客周赛 Round 74

D. 预知 题目链接 题意有点绕,简单来说是其中一堆牌,问最少预知几张才能保证任取两张都不会导致种类重复。一开始对每张牌种类不是已知的,已知的是每种牌的牌数。 思路就是相当于把其中一种明牌,保证任取两张都不会导致种类重复…

【linux学习指南】SIGCHLD信号

文章目录 📝SIGCHLD信号🚩总结 📝SIGCHLD信号 进程⼀章讲过⽤wait和waitpid函数清理僵⼫进程,⽗进程可以阻塞等待⼦进程结束,也可以⾮阻塞地查询是否有⼦进程结束等待清理(也就是轮询的⽅式)。采⽤第⼀种⽅式,⽗进程阻塞了就不能处理⾃⼰的⼯…

AI助力SEO优化的关键词策略解析

内容概要 在数字营销的快速发展中,人工智能(AI)正逐步成为提升搜索引擎优化(SEO)效果的重要工具。关键词策略是SEO成功的关键要素之一,而AI技术的应用使得这一过程更加高效和精准。在关键词研究中&#xf…

PHP-Casbin v4.0.0 发布,支持 ACL、RBAC、ABAC 等模型的访问控制框架

PHP-Casbin 是一个用 PHP 语言打造的轻量级开源访问控制框架,支持 ACL、RBAC、ABAC 多种模型。它采用了元模型的设计思想,支持多种经典的访问控制方案,如基于角色的访问控制 RBAC、基于属性的访问控制 ABAC 等。 更新内容: http…

解决Git中没有小绿勾与红叉叉的问题

一、检查自己的软件 必须安装Git和Tortoisegit(也就是俗称的小乌龟)这两个软件。 Git的下载地址: CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?pathgit-for-windows/ 寻找与自己电脑相配的软件版本就可以了。 Tor…

搭建跨境电商企业博客的指南

在跨境电商领域,企业博客不仅是展示品牌形象的窗口,也是连接全球客户的重要桥梁。一个精心搭建的企业博客能够提升品牌知名度、增强客户信任,并促进销售。 搭建企业博客的必要性 1. 建立品牌权威:通过高质量的内容,企…

渗透学习笔记(十一)Burp Suite 总结

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…

课设CLion连接Ubuntu14makeQt项目出错解决汇总

在这之前需要注意以下几点: 1、需要 确保CLion能连接Ubuntu14 2、cmakelist.txt文件配置 3、知道部署路径: 问题一:/usr/bin/ld: cannot open output file GreedySnake: Is a directory 否则就会出现make以后应该生成一个可执行文件&…

【GO基础学习】gin的使用

文章目录 模版使用流程参数传递路由分组数据解析和绑定gin中间件 模版使用流程 package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {// 1.创建路由r : gin.Default()// 2.绑定路由规则,执行的函数// gin.Context&#x…

磁编码器(Magnetic Encoder)

磁编码器(Magnetic Encoder)是一种传感器,它通过检测磁性材料的磁场变化来测量旋转或线性位置。编写用于读取磁编码器数据的C语言程序时,您需要根据具体的硬件接口和编码器类型进行调整。以下是一个基本的框架,假设我们…

Qt Creator项目构建配置说明

QT安装好之后,在安装目录的Tools\QtCreator\bin下找到qtcreator.exe文件并双击打开 点击文件-新建文件或项目 选择Qt Widgets Application 设置项目名称以及路径 make工具选择qmake(cmake还未尝试过) 设置主界面对应类的名称、父类&#…

智能边缘计算×软硬件一体化:开启全场景效能革命新征程(企业开发者作品)

边缘智能技术快速迭代,并与行业深度融合。它正重塑产业格局,催生新产品、新体验,带动终端需求增长。为促进边缘智能技术的进步与发展,拓展开发者的思路与能力,挖掘边缘智能应用的创新与潜能,高通技术公司联…

【React】- 跨域PDF预览、下载(改文件名)、打印

我们经常会碰到跨域来方位PDF,同时需要下载、打印的需求,通常由于浏览器的安全策略,可以预览,但是下载和打印可能会受限,这时候怎么办呢? 1.创建一个隐藏的标签 要下载 iframe 中的 PDF 文件,…

Ps:创建数据驱动的图像

在设计实践中,常常需要处理大量内容变化但设计格式统一的任务,例如批量生成名片、工作证、学生证、胸牌、奖状或证书甚至图册。这些工作如果逐一手动制作,不仅耗时费力,还容易出错。 为解决这一问题,Photoshop 提供了强…

Kotlin 协程基础知识总结六 —— 协程 Flow 的综合应用

1、项目描述与搭建 (P92~P94)我们会将几个 Flow 的应用实例放在同一个 Demo 中,主页就是一个 Activity 里包含一个按钮,点击按钮跳转到对应的功能展示页面上。整体架构采用一个 Activity 多个 Fragment 的结构,结合 J…

环,域,体,整区,理想,极大理想,

环: 定义: 加法交换群 乘法半群 分配律 域的定义: 加法交换群 乘法群(去掉0元是交换群) 分配律 Eg:比如整数集合不是域,因为对于乘法来说,去掉0后没有单位元了,但是是环 Eg…

关于Flutter应用国际化语言的设置

目录 1. Locale配置 2. 用户切换/启动自动加载缓存里面的locale 由于最近在开发app国际化设置的时候遇到一些问题,所以做出一些总结。 1. Locale配置 具体的初始化配置可以参考文档:i18n | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 值得…

【游戏开发】游戏生产的标准与工业化,管线Pipeline的概念与设计(项目管理,资产管理)

【游戏开发】游戏生产的标准与工业化,管线Pipeline的概念与设计(项目管理,资产管理) 文章目录 1、管线(Pipeline)是什么?1.1 管线解决什么问题(例子)1.2 一个动画电影的完…

探寻 OneCode 核心优势:MVVM 进阶与前后端协同之魅

在当今的软件开发领域,高效、可维护且功能强大的架构是开发者们不懈追求的目标。OneCode 凭借其独特的增强版 MVVM 架构、前后端一体化特性,以及创新的技术如 OneCode DSM(Domain-Specific Modeling,领域特定建模)、视…