pythonflaskmock数据_基于 Flask 的简易 Mock 平台

2023-10-27

Mock Server

基于Flask实现的一个简易Mock平台,使用标准json结构体编写Mock Api https://github.com/yinquanwang/MockServer

Key Features

遵循Http协议,支持GET 、POST 、PUT 、DELETE 常用http请求方式

mock结构体为标准json结构,支持参数内容规则制定以及对象返回信息

内置常用校验器,equals、contains、between、length、type, 可灵活自己扩展

支持自定义报文Valid与Invalid,返回报文可以是任意类型

数据类型丰富,支持string、int、float、list、dict

得益于Flask强大的路由系统,设计核心就是将所有请求的path归一化到一个视图函数处理: @app.route('/', methods=['GET', 'PUT', 'DELETE', 'POST'])

def dispatch_request(path):

"""

mock view logic

:param path: request url for mock server

:return: response msg that use default or custom defined

"""

m = models.Api.query.filter_by(url=request.path, method=request.method).first_or_404()

body = json.loads(m.body)

return domain_server(**body)

@app.errorhandler(404)

def url_not_found(error):

return json.dumps({

"status": 404,

"msg": "the request url not found,please check"

})

如果mock脚本不自定义返回报文,由系统默认提供,默认标准json结构体 VALID = {

"success": True,

"code": "0000",

"msg": "success"

}

INVALID = {

'code': '0020',

'msg': 'request data invalid',

'success': False

}

MISS = {

'code': '0021',

'msg': 'request data missed',

'success': False

}

TYPE_NOT_MATCH = {

"success": False,

"code": "0001",

}

EQUALS = {

"success": False,

"code": "0005",

}

NOT_BETWEEN = {

"success": False,

"code": "0007",

}

STR_NOT_CONTAINS = {

"success": False,

"code": "0004",

}

STR_TOO_LONG = {

"success": False,

"code": "0006",

}

由此我们必须实现一个校验器,对各个字段进行一些基本校验 class Validator:

"""

Validator for mock check

"""

@classmethod

def valid(cls, response=None):

return get_response(response, VALID)

@classmethod

def type_not_match(cls, type, data, response=None):

msg = '{data} must be {type} type'.format(data=data, type=type)

TYPE_NOT_MATCH['msg'] = msg

if type == 'int':

if not isinstance(data, int):

return get_response(response, TYPE_NOT_MATCH)

elif type == 'float':

if not isinstance(data, float):

return get_response(response, TYPE_NOT_MATCH)

elif type == 'string':

if not isinstance(data, str):

return get_response(response, TYPE_NOT_MATCH)

elif type == 'bool':

if not isinstance(data, bool):

return get_response(response, TYPE_NOT_MATCH)

elif type == 'list':

if not isinstance(data, list):

return get_response(response, TYPE_NOT_MATCH)

elif type == 'dict':

if not isinstance(data, dict):

return get_response(response, TYPE_NOT_MATCH)

else:

return False

@classmethod

def is_not_equals(cls, data, expect, response=None):

if data != expect:

msg = '{data} must be equals {expect}'.format(data=data, expect=expect)

EQUALS['msg'] = msg

return get_response(response, EQUALS)

else:

return False

@classmethod

def is_not_between(cls, data, between, response=None):

try:

min = between[0]

max = between[1]

except IndexError:

return {'msg': 'mock config error'}

if data > max or min < min:

msg = '{data} must be between in {between}'.format(data=data, between=between)

NOT_BETWEEN['msg'] = msg

return get_response(response, NOT_BETWEEN)

else:

return False

@classmethod

def is_not_contains(cls, data, expect, response=None):

if data not in expect:

msg = '{data} not in {expect}'.format(data=data, expect=expect)

STR_NOT_CONTAINS['msg'] = msg

return get_response(response, STR_NOT_CONTAINS)

else:

return False

@classmethod

def is_too_long(cls, data, length, response=None):

if len(data) > length:

msg = '{data} is too long, max length is {length}'.format(data=data, length=length)

STR_TOO_LONG['msg'] = msg

return get_response(response, STR_TOO_LONG)

else:

return False

接下来便是对请求数据与期望数据匹配,从而返回相应报文了 def domain_server(**kwargs):

"""

used for POST PUT DELETE

:param kwargs: standard json mock scripts

:return: response msg

"""

data = kwargs.get('data', {})

invalid = kwargs.get('invalid', {})

if request.json:

form = request.json

elif request.form:

form = request.form

elif request.args:

form = request.args

if data is {}: # do not have any parameters

return Validator.valid(response=kwargs.get('valid'))

else:

if len(form) != len(data): # data do not matched

return json.dumps(MISS, ensure_ascii=False)

for key in form.keys():

if key not in data.keys():

return json.dumps(INVALID, ensure_ascii=False)

for key, value in form.items(): # usually validators

expect = data.get(key)

type = expect.get('type')

msg = Validator.type_not_match(type, value, response=invalid.get('type'))

if msg:

return msg

contains = expect.get('contains')

if contains:

msg = Validator.is_not_contains(value, contains, response=invalid.get('contains'))

if msg:

return msg

equals = expect.get('equals')

if equals:

msg = Validator.is_not_equals(value, equals, response=invalid.get('equals'))

if msg:

return msg

long = expect.get('long')

if long:

msg = Validator.is_too_long(value, long, response=invalid.get('length'))

if msg:

return msg

between = expect.get('between')

if between:

msg = Validator.is_not_between(value, between, response=invalid.get('between'))

if msg:

return msg

return Validator.valid(response=kwargs.get('valid'))

指导说明

example for get request

json

{

"data": {

"password": {

"equals": "lcc",

"type": "string"

},

"username": {

"equals": "lcc",

"type": "string"

}

},

"invalid": {

"equals": {

"msg": "恭喜啊,查询到该账号了"

},

"type": "类型不匹配啊"

},

"method": "GET",

"name": "查询接口",

"url": "/get/",

"valid": {

"msg": "查询成功啦",

"success": true

}

}

例如上述json结构体,此get请求有两个参数username,password, type=string,equals=lcc ,规定了valid报文和invalid中的equals报文

example for post

支持json和form,系统会自动进行分辨

json

{

"data": {

"email": {

"equals": {

"lcc": "lcc@qq.com",

"yqw": "yqw@qq.com"

},

"type": "dict"

},

"password": {

"type": "string"

},

"username": {

"equals": "lcc",

"length": 10,

"type": "string"

}

},

"invalid": {

"equals": {

"msg": "哥们,类型不匹配啊"

},

"type": "类型不匹配啊"

},

"method": "POST",

"name": "注册接口",

"url": "/register/",

"valid": {

"msg": "注册成功啦"

}

}

example for put

json

{

"data": {

"identity": {

"equals": "1",

"type": "string"

}

},

"invalid": {

"equals": {

"msg": "啊哦 该账号没有记录哦"

},

"type": "类型不匹配啊"

},

"method": "put",

"name": "更新接口",

"url": "/put/",

"valid": {

"msg": "查询成功啦",

"success": true

}

}

example for delete

json

{

"data": {

"account": {

"equals": "lcc123456",

"length": 10,

"type": "string"

}

},

"invalid": {

"equals": {

"msg": "啊哦 该账号没有记录哦"

},

"type": "类型不匹配啊"

},

"method": "delete",

"name": "删除接口",

"url": "/del/1/",

"valid": {

"msg": "删除成功啦",

"success": true

}

}

## 由于第一次接触Flask,mock的理解自己可能也有偏差,所以还请各位大神不要见怪

本地开发环境部署

git clone 或者 checkout至本地目录

修改:MockServer/config.py 数据库相关配置

python

USERNAME = 'root'

PASSWORD = 'lcc123456'

HOST = '127.0.0.1'

DB = 'MockServer'

安装相应依赖库

bash

pip install -r requirements.txt

创建MockServer数据库, 默认DB是MockServer

生成数据库迁移脚本,应用表结构

bash

python manage.py db init

python manage.py db migrate

python manage.py db upgrade

Start Server

bash

python run.py

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pythonflaskmock数据_基于 Flask 的简易 Mock 平台 的相关文章

  • 单片机不支持printf 浮点类型的解决办法

    在一些单片机中因为资源受限官方提供的SDK中通常不提供浮点类型数据的打印 如需浮点打印功能可以参考如下做法 前提条件 1 串口通信正常 2 printf 函数已经移植完成 操作方法 1 添加以下函数到工程 以下函数的作用为将一个float类
  • 实现一台电脑登录多个微信账号/一个微信账号在多台电脑登录

    一 一台电脑登录多个微信账号 在电脑桌面建立一个txt文档文件 输入内容 echo off start d C Program Files Tencent WeChat WeChat exe start d C Program Files
  • 鸿星尔克的对话

    夏季 炎热 每一次水灾都是见证人心 见证中国 奇迹的时候 太多太多感触东西 生在这样国度 倍感荣幸 鸿星尔克 火 天上掉下来的馅饼被一个真诚企业接住 应该值得庆幸 但是不是所有人都能接着住的 理性消费 为消费者 不要因为我们 给同行造成困扰
  • pytorch+transformer:简单的时序信号监测

    这里是厂妹 今天整个小课题试试看 上次那个机械臂因为专利问题暂时下架 等专利出来了再发布 话不多说 这次就直接开始吧 1 概述与思路详解 这又是放在一个硬件上面搭配的算法 放在可变换姿态的硬件上 判断当前倾角姿态和硬件姿态的关系 可能融合一
  • 2022年度编程语言排行榜来啦,它凭什么能超过C语言,排名第一?

    IEEE Spectrum 发布了 2023 年度编程语言排行榜 其中 Python 在总榜单以及其他几个分榜单中依然牢牢占据第一名的位置 另外值得关注的是微软 C 语言 它的排行从 2022 年的第 23 名跃升至了今年的第 6 名 称得
  • proxmox-(一)维护小工具

    一常用维护工具 1 1 任务卡主了 后台强制关机 找到对应虚机锁文件 直接删除该锁文件 然后后台执行命令 关机 比如 101虚机 前台执行的关机task 一直在运行 root procompute01 ps ef grep task roo
  • Java 数据结构与算法 栈和队列

    在生活中 我们常常遇到这样的情景 1 某人在学校发书的时候 如果要拿出最上面的书来看 那么直接拿出来就可以了 但是如果想要拿出中间某个位置的书来看 必须要挪开它上面压的书 才能看到这本书 这个时候 就是只能最上面的先拿出来 最下面的后拿出来
  • Numpy 的文件存储.npy和.npz 区别

    Numpy能读写磁盘上的文本数据和二进制数据 提供了多种存取数组内容的文件操作函数 保存数组数据的文件可以是二进制格式或者文本格式 1 将数组以二进制格式保存到磁盘 npy格式 np load 和 np save 是读写磁盘数组数据的两个主
  • 【操作系统实验】Ubuntu Linux 虚拟机文件查找相关命令

    文章目录 whereis help man find locate grep wc 管道 whereis 功能描述 寻找命令的二进制文件 同时也会找到其帮助文件 主要功能是寻找一个命令所在的位置 和find相比 whereis查找的速度非常
  • Linux下安装Jupyter并配置多个ipykernel

    安装Jupyter pip3 install jupyter notebook 或者 pip install i https pypi douban com simple jupyter 生成配置文件 jupyter notebook ge
  • Qt开源库-工具选项卡-【TabToolBar】

    一 序言 对于Windows 的文件管理器的菜单栏 设计得很漂亮 如下图所示 本文分享一个用于开发类似于Windows 文件管理器菜单栏的Qt开源库 TabToolBar 开源项目URL https github com SeriousAl
  • idea创建Gradle项目

    Gradle是什么 Gradle是一种以Groovy语言为基础的自动化构建工具 自动化构建本质上也是一种程序 我们开始编译时就启动这个程序 然后读取我们在 gradle 文件中配置的参数来实例化各个类 然后按照顺序依次执行对应的任务即可完成
  • CSS样式大全(网络收集整理)

    CSS样式大全 网络收集整理 字体属性 font 大小 font size x large 特大 xx small 极小 一般中文用不到 只要用数值就可以 单位 PX PD 样式 font style oblique 偏斜体 italic
  • MyBatis动态拼接sql,statementType="STATEMENT"使用

    背景 写一个需求 展示数据的结果需要将查询出来的结果列转行 但是发现需要列转行的数据是动态的 没办法确定有多少个 所以需要动态的拼接sql处理 起初设想是在MyBatis里面去动态拼接 然后尝试多次放弃了 要动态拼接的sql如下 下面是静态
  • [转]QNX-Momentics-IDE开发环境设置-功能调试

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 一 QNX M
  • CMake中引用Boost库

    CMake中引用Boost库 文章目录 概述 CMakeLists txt编写 find package 搜索路径设置 用例 Boost动态库链接 Boost头文件库链接 概述 在Linux开发时常常使用Boost库 若项目使用CMake进
  • 汇通达港交所上市:市值超240亿港元 阿里与顺为是股东

    雷递网 雷建平 2月18日报道 汇通达网络股份有限公司 简称 汇通达 股票代码为 09878 今日在港交所上市 汇通达此次引入6家基石投资者 包括创维 商汤 景林 金螳螂建筑 Windfall 海澜集团 设有6个月禁售期 上述基石投资者一共
  • 热点|ChatGPT到底是什么,ChatGPT给通信行业带来什么影响

    最近这段时间 ChatGPT火爆全网 引发了整个社会的强烈关注 这个来自OpenAI公司的聊天机器人 表现出了极为逆天的人工智能水平 让所有人为之震惊 其实 对人工智能 以下简称 AI 的能力 人类是有心理准备的 数十年来 我们观看的很多影
  • 简单的CSS案例——新闻介绍

随机推荐

  • C++删除文件

    使用remove函数删除本地文件 头文件 include
  • C++类模板实例化与专门化

    12 8 C 类模板实例化与专门化 12 8 1 隐式实例化 编译器只有在生成模板对象的时候才会生成模板类的实例化类定义 然后根据实例化类生成对象 12 8 2 显式实例化 12 8 2 1 定义 使用关键字template并指定类型的语句
  • unsigned char 类型数据似乎不能用作赋值

    unsigned char 类型的数据似乎不能用作赋值的量 起初我以为给unsigned char类型的数组赋值也要用unsigned char类型的变量才行 include
  • thinkphp的debug调试开启、关闭

    官方文档 https www kancloud cn manual thinkphp6 0 1037618 前言 强烈建议在开发阶段始终开启调试模式 直到正式部署后关闭调试模式 方便及时发现隐患问题和分析 解决问题 开启 如果你是通过 Co
  • 4月程序员薪资出炉,又又又拖后腿了?

    无论你等或不等 4月全国程序员就业薪资排行榜都已经来了 在这次的排行中 北京以18094元排行第一名 杭州 南京等新一线城市的排名表现不错 甚至超过一线城市广州 快来看看你拖城市后腿了没有 来源网络 如侵删 从城市排行中可以看到 现在程序员
  • CUDA Samples: Long Vector Add

    以下CUDA sample是分别用C 和CUDA实现的两个非常大的向量相加操作 并对其中使用到的CUDA函数进行了解说 各个文件内容如下 common hpp ifndef FBC CUDA TEST COMMON HPP define F
  • mybatis的一些特殊符号标识(大于,小于,等于,不等于)

    特殊字符 替代符号 红色基本为常用的 amp lt lt gt gt quot apos 小于等于 a lt b a lt b a b 大于等于 a gt b a gt b a b 不等于 a ba b a
  • 【allegro 17.4软件操作保姆级教程十一】表贴器件封装制作

    个人主页 highman110 作者简介 一名硬件工程师 持续学习 不断记录 保持思考 输出干货内容 目录 封装组成元素 焊盘类型 表贴器件封装制作 环境设置 计算坐标 放置pin脚 绘制丝印线 放置位号和value 放置1脚标识 放置其他
  • Linux QT GUI 界面程序打包 linuxdeployqt

    说明 1 主要依赖linuxdeployqt打包工具 2 打包Linux上的QT界面软件 使其不依赖QT开发环境 linuxdeployqt安装过程 不能下载官方编译好的 appimage文件 会报告gblic的问题 下载官方源码 修改ma
  • 【深度学习】真正的即插即用!盘点11种CNN网络设计中精巧通用的“小”插件...

    作者丨皮特潘 编辑丨极市平台 导读 所谓 插件 就是要能锦上添花 又容易植入 落地 即真正的即插即用 本文盘点的 插件 能够提升CNN平移 旋转 scale等变性能力或多尺度特征提取 感受野等能力 在很多SOTA网络中都会看到它们的影子 前
  • java基础题系列(1 - 10)

    说在前面 马上就要到秋招了 也从网上获取了一些java的基础面试题 总共有100多道 为了保持状态 每天回顾10道左右 如果result有不对的地方 希望各位大佬可以指正 谢谢 20200706 by 1z 请你说说java和php的区别
  • [开发

    使用Jackson库解析JSON 在Maven项目中 在pom xml中添加以下依赖
  • Mac连接网线能够接收微信消息,浏览器不能访问网页

    1 问题 Mac连接网线能够接收微信消息 浏览器不能访问网页 访问网页 有提示 如下信息 找不到IP地址 2 解决方法 和其他人的配置进行比较 发现自己的网络设置中 DNS服务器显示的是8 8 8 8 其他人的是灰色的DNS服务器 点击高级
  • git blame命令详解

    文章目录 1 git blame用法 2 举例 1 git blame用法 git blame用来追溯一个指定文件的历史修改记录 git blame用来追溯一个指定文件的历史修改记录 它能显示任何文件中每行最后一次修改的提交记录 所以 如果
  • mybatis---设置typeAliasesPackage支持通配符匹配

    设置typeAliasesPackage支持 通配符匹配 mybatis的typeAliasesPackage属性的作用是 搜索指定包别名 配置了以后xml文件中的resultType和parameterType就不需要指定全类名com e
  • linux服务器网站安全狗安装教程

    1 下载服务器安全狗和服务器网站安全狗 选择好版本 http download safedog cn safedog linux64 tar gz 这个是网站安全狗的下载地址 2 进行下载 命令是 wget http down safedo
  • CTF实战30 CTF题目练习和讲解五

    该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试 请勿用于其他非法用途 如用作其他非法用途与本文作者无关 这一阶段我们将会接触PWN类的题目 PWN等于REVERSE 因为一开始可能很多逆向的基础都不太好 毕竟我们重点不是PW
  • 安卓学习之自定义View类和控件(Button去掉边框)

    在很多情况下 我们需要自定义属于自己的layout 毕竟很多时候我们需要把 一些经常用到的布局保存下来 在以后继续使用 避免重复代码 标题栏实例 xml代码如下 style android attr borderlessButtonStyl
  • 时空预测

    目录 线性时空预测 图时空预测 线性时空预测 这篇文章在时空预测领域 搭建了一个简单高效的线性模型 且使用了channel independence的方式进行建模 模型的整体结构如下图所示 是一个级联的结构 输入分为三个部分 tempora
  • pythonflaskmock数据_基于 Flask 的简易 Mock 平台

    Mock Server 基于Flask实现的一个简易Mock平台 使用标准json结构体编写Mock Api https github com yinquanwang MockServer Key Features 遵循Http协议 支持G