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

news2025/4/18 14:51:45

前言

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

那么, 继续学习吧!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux | 零基础Ubuntu解压RaR等压缩包文件

目录 介绍 案例分析 安装工具 解压实践 介绍 RAR是一种专利文件格式,用于数据压缩与归档打包,开发者为尤金罗谢尔(俄语:Евгений Лазаревич Рошал,拉丁转写:Yevgeny Lazarevich R…

Python基于卷积神经网络的车牌识别系统开发与实现

1. 简介 车牌识别是人工智能在交通领域的重要应用,广泛用于高速违章检测、停车场管理和智能交通系统等场景。本系统通过基于卷积神经网络(CNN)的深度学习算法,结合 Python 和 MySQL 实现车牌的快速识别与管理。 系统特点&#x…

stm32内部flash在线读写操作

stm32内部flash在线读写操作 📍相关开源库文章介绍《STM32 利用FlashDB库实现在线扇区数据管理不丢失》 ✨不同系列,内部flash编程有所区别。例如stm32f1是按照页擦除,半字(16bit)或全字(32bit)数据写入;st…

IDEA | SpringBoot 项目中使用 Apifox 上传接口

目录 1 安装 Apifox Helper 插件2 获取 Apifox 的 API 访问令牌3 IDEA 中设置 API 访问令牌4 IDEA 中上传接口5 常见问题5.1 如何自动设置目录名5.2 如何自动设置接口名5.3 如何更改上传位置 Apifox 官方指南: https://apifox.com/help/applications-and-p…

Leetcode 10-正则表达式匹配/ 剑指 Offer 19. 正则表达式匹配

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 ‘*’ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串。 题解 字符串匹配多…

学习vue3的笔记

一、vue和react的对比 1、基础介绍 vue:https://cn.vuejs.org/ vue3是2020年创建的 react:https://react.dev/ react是一个2013年开源的JavaScript库,严格意义上来说不是一个框架 2、diff算法 两个框架采用的都是同级对比策略 两节点对…

基于STM32的智能家居环境监控系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 环境监控模块控制模块显示模块系统实现 硬件实现软件实现系统调试与优化结论与展望 1. 引言 随着智能家居技术的发展,环境监控系统已经成为家居管理的重要组成部分。智能家居环境监控系统通过实时监测室内温度、湿…

【MySQL】搞懂mvcc、read view:MySQL事务原理深度剖析

前言:本节内容是事务里面最难的一部分, 就是理解mvcc快照读和read view。这两个部分需要了解隔离性里面的四种隔离级别。 博主之前讲过,但是担心友友们不了解, 所以这里开头进行了复习。 下面开始我们的学习吧! ps&…

jmeter设置tps、响应时间监测时间间隔

jmeter设置tps、响应时间监测时间间隔 思路: 1、设置tps和响应时间插件的采集时间间隔,然后运行jmeter脚本; 2、先按默认配置跑出jtl文件保存下来,再添加tps和响应时间插件,设置采集时间间隔后,导入jtl文件…

Qt 12.30 day5

day5_testppp.proQT core gui texttospeech widget.h#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent>//定时器事件类 #include <QTimer>//时间事件类 #include <QTime>//时间类 #include <QTextToSpeech>//…

玩转OCR | 腾讯云智能结构化OCR初体验

随着数字化进程的加速&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术已逐渐成为提高企业生产力、优化工作流的重要工具。腾讯云智能结构化OCR凭借其领先的技术、广泛的应用场景和灵活的定制化能力&#xff0c;正在帮助各行业客户更高效地进行文档处理与数据提取。本…

Spring Boot教程之三十九: 使用 Maven 将 Spring Boot 应用程序 Docker 化

如何使用 Maven 将 Spring Boot 应用程序 Docker 化&#xff1f; Docker是一个开源容器化工具&#xff0c;用于在隔离环境中构建、运行和管理应用程序。它方便开发人员捆绑其软件、库和配置文件。Docker 有助于将一个容器与另一个容器隔离。在本文中&#xff0c;为了将Spring B…

模仿微信小程序wx.showModal自定义弹窗,内容可以修改

实现以下弹框样式功能 1.在components新建一个文件showModel.wpy作为组件&#xff0c;复制下面代码 <style lang"less" scoped> .bg_model {display: flex;justify-content: center;align-items: center;// 弹框背景.bg_hui {width: 100%;height: 100%;posi…

缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布

近期&#xff0c;JuiceFS 企业版推出了 Cache Group Operator&#xff0c;用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具&#xff0c;它能够自动化应用程序的生命周期管理任务&#xff0c;使部署、扩展和运维更加高效。 在推出 Operator 之前…

零基础微信小程序开发——小程序的宿主环境(保姆级教程+超详细)

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

GPU 进阶笔记(二):华为昇腾 910B GPU

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; 1 术语 1.1 与 NVIDIA 术语对应关系1.2 缩写2 产品与机器 2.1 GPU 产品2.2 训练机器 底座 CPU功耗操作系统2.3 性能3 实探&#xff1a;鲲鹏底座 8*910B GPU 主机 3.1 CPU3.2 网卡和网络3.3 GPU 信息 3.3…

微服务SpringCloud分布式事务之Seata

视频教程&#xff1a;https://www.bilibili.com/video/BV16P63Y3ESq 效果演示 准备的微服务项目调用的链路如下&#xff1a; 文字描述&#xff1a; gateway模块接收到请求&#xff0c;并发送到order订单模块order订单模块接收到请求&#xff0c;新增一个订单数据后发送一个…

HTML——13.超链接

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>超链接</title></head><body><!--超链接:从一个网页链接到另一个网页--><!--语法&#xff1a;<a href"淘宝网链接的地址"> 淘宝…

STM32 高级 WIFi案例1:测试AT指令

需求描述 测试AT指令是否能够正常控制ESP32的wifi&#xff0c;比如重启、读取设备信息等。 思路&#xff1a; stm32通过串口usart2向ESP32发布命令。ESP32通过串口1返回信息。 配置&#xff1a; 第一步&#xff1a;对ESP32芯片烧录可以读取stm32命令的固件&#xff08;fac…

GXUOJ-算法-第四次作业(圆排列、连续邮资、n皇后、符号三角形)

1.圆排列 问题描述 GXUOJ | 圆排列 代码解答 #include<bits/stdc.h>using namespace std;int n; int r[1000]; double x[1000]; double ans 0x3f3f3f3f;double calculate(){memset(x, 0, sizeof x);for(int i 0; i < n; i){for(int j 0; j < i; j)x[i] max(…