python使用笔记22--mock接口开发
1.mock接口开发
mock是模拟一个接口的意思
为了不阻止测试,开发一个接口,返回你想要的数据,模拟各种场景
需要安装第三方模块flask,flask是web轻量级开发框架
1.1 flask
pip install flask
1 #mock 模拟一个接口的意思
2 #http://test.pay.alibab.com/payment
3 #1、为了不阻碍测试,开发了一个接口,返回你想要的数据,模拟各种场景
4
5 import flask
6 import json
7 import pymysql
8 import hashlib
9 import redis
10 import time
11 #flask web轻量级开发框架
12 server = flask.Flask(__name__)
13
14
15 mysql_info = {'host':'127.0.0.1',
16 'port':3306,
17 'user':'root',
18 'password':'123456',
19 'autocommit':True,
20 'db':'db001',
21 'charset':'utf8'}
22
23
24 #md5加密之后,是固定的,这样的安全性不够高
25 #可以加盐,salt='xiaoxiaolin_rew43!@',设置一串复杂的字符串,加强安全性
26 def md5(s,salt='xiaoxiaolin_rew43!@'):#md5加密
27 s = str(s+salt)
28 m = hashlib.md5(s.encode())
29 return m.hexdigest()
30
31 def op_redis(key,value=None,expire=60*60*2):
32 r = redis.Redis(host="127.0.0.1", port=6379, password="123456&*", decode_responses=True)
33 if value:#如果传入值不为空,则保存值
34 r.set(key,value,expire)
35 else:#value值为空,则获取值
36 return r.get(key)
37
38
39
40 def select(sql,oneTag=False):
41 connect = pymysql.connect(**mysql_info)#**表示将字典转成host='xxx',port=3306
42 cur = connect.cursor(pymysql.cursors.DictCursor)#获取游标,获取表头
43 cur.execute(sql)
44 if oneTag:
45 result = cur.fetchone()
46 else:
47 result = cur.fetchall()#获取查询结果
48 print(result)
49 cur.close()
50 connect.close()
51 return result
52
53
54 @server.route('/api/payment',methods=['get'])#methods:用来指定请求方式,get/post
55 def payment():
56 data = {"code":0,"msg":"支付成功","amount":30000}
57 return json.dumps(data,ensure_ascii=False)
58
59 @server.route('/api/account_data',methods=['get'])
60 def account_data():
61 account_name = flask.request.values.get('account_name')#获取请求参数,key-value形式的
62 #flask.request.json.get()#获取json格式的参数
63 print(account_name)
64 result = select("select * from account_info where uname = '%s';" %account_name)
65 print(result)
66 data = {'code':0,'msg':'success','data':result}
67 return json.dumps(data,ensure_ascii=False)
68
69 @server.route('/api/account_register',methods=['post'])
70 def register():#注册
71 uname = flask.request.values.get('uname')
72 password = flask.request.values.get('password')
73 cpwd = flask.request.values.get('cpwd')
74 select_sql = "select * from account_info where uname = '%s';" % uname
75 if uname and password and cpwd:#输入参数均不为空
76 if password != cpwd:
77 data = {'code': 401, 'msg': '两次输入密码不一致'}
78 elif select(select_sql):#如果查询结果不为空,则不能注册
79 data = {'code': 402, 'msg': '输入的账号已存在'}
80 else:
81 md5_pwd = md5(password)
82 insert_sql = "insert into account_info(uname,password) values('%s','%s');"%(uname,md5_pwd)
83 select(insert_sql)
84 data = {'code': 200, 'msg': '注册成功'}
85
86 else:
87 data = {'code':400,'msg':'输入参数不能为空'}
88
89 return json.dumps(data,ensure_ascii=False)
90
91 #登录成功后要返回token,token=username+timestamp md5加密
92 @server.route('/api/login',methods=['post'])
93 def login():
94 uname = flask.request.values.get('uname')
95 password = flask.request.values.get('password')
96 if uname and password:
97 select_sql = "select * from account_info where uname = '%s';" % uname
98 result = select(select_sql,True)
99 print(md5(password))
100 if result:
101 if md5(password) == result.get('password'):
102 token = md5(uname+str(time.time()))#token:uname+timestamp md5加密,保存到redis中,设置有效时间
103 info = {'username':uname,'id':result.get('id')}
104 op_redis(token,json.dumps(info))
105 data = {'code': 200, 'msg': '登录成功','token':token}
106 else:
107 data = {'code': 401, 'msg': '用户不存在'}
108 else:
109 data = {'code': 403, 'msg': '输入密码错误'}
110 else:
111 data = {'code': 402, 'msg': '账号/密码不能为空'}
112
113 return json.dumps(data,ensure_ascii=False)
114
115 @server.route('/api/payment_v1',methods=['post'])
116 def payment_v1():
117 token = flask.request.values.get('token')
118 amount = flask.request.values.get('amount')
119 if token:#如果token不为空,则去redis中查询用户信息
120 result = op_redis(token)
121 if result:
122 amount = float(amount)
123 result = json.loads(result)
124 userid = result.get('id')
125 update_sql = 'update account_info set balance = balance-%s where id =%s ; '%(amount,userid)
126 print(update_sql)
127 select(update_sql)
128 data = {'code': 0, 'msg': '支付成功'}
129 else:
130 data = {'code': 400, 'msg': '用户未登录'}
131 else:
132 data = {'code':400,'msg':'用户未登录'}
133
134 return json.dumps(data,ensure_ascii=False)
135
136
137
138 server.run(host='0.0.0.0',port=9999,debug=True)#服务启动只启动一次,服务启动后,不会再执行下面的代码,debug:改代码后不需要重启服务
139 #host='0.0.0.0',这个不写只能在本机访问,如果写上,别人也可以调用你的接口
1.2 fastapi
pip install fastapi
pip install uvicorn
1 import fastapi
2 import uvicorn
3 from pydantic import BaseModel
4
5
6
7 server = fastapi.FastAPI()#实例化一个接口
8 class User(BaseModel):
9 username:str
10 password:str
11 phone:str
12
13
14 @server.post('/user')
15 def user(u:User):#入参是json类型的,要先定义一个类,继承BaseModel
16 print(User)
17 return {'code':0}
18
19 @server.get('/index')
20 def index(id:int,sex:str):
21 if sex=='nan':
22 data = {'id':id,'sex':'男'}
23 else:
24 data = {'id': id, 'sex': '女'}
25
26
27 @server.post('/order')#@:装饰器
28 def order(type:str):
29 if type == 'success':
30 data = {'id':1,'order_amount':10000}
31 else:
32 data = {'id':0,'order_amount':0}
33
34 @server.post('/login')
35 def login(username:str,password:str):
36 if username and password:
37 data = {'code':0,'msg':'登录成功'}
38 else:
39 data = {'code': 0, 'msg': '登录失败'}
40
41
42
43 if __name__ == '__main__':
44 uvicorn.run('fastapi接口开发:server',port=9000,debug=True)#第一个参数是python文件名
2.加密
对称加密:加密和解密用的同样的秘钥
不对称加密:加密和解密用的不同的秘钥
md5加密:md5加密是不可逆转的
1 #md5加密是不可逆转的
2 import hashlib
3 s = '123456'
4 m = hashlib.md5(s.encode())#md5 传入的值是bytes
5 #不管字符串多长,加密后都是32位的值
6 #m = hashlib.sha224(s.encode())
7
8 result = m.hexdigest()#加密
9 print(result)
3.token产生和校验
在登录成功后,都会返回一个token
token是一个唯一的,随机的,且有时效性的值
下面生成token的规则一般是:用户名+timestamp 再md5加密
token保存在redis中,以便于后面接口校验token
3.1.登录接口--生成token
1 #登录成功后要返回token,token=username+timestamp md5加密
2 @server.route('/api/login',methods=['post'])
3 def login():
4 uname = flask.request.values.get('uname')
5 password = flask.request.values.get('password')
6 if uname and password:
7 select_sql = "select * from account_info where uname = '%s';" % uname
8 result = select(select_sql,True)
9 print(md5(password))
10 if result:
11 if md5(password) == result.get('password'):
12 token = md5(uname+str(time.time()))#token:uname+timestamp md5加密,保存到redis中,设置有效时间
13 info = {'username':uname,'id':result.get('id')}
14 op_redis(token,json.dumps(info))
15 data = {'code': 200, 'msg': '登录成功','token':token}
16 else:
17 data = {'code': 401, 'msg': '用户不存在'}
18 else:
19 data = {'code': 403, 'msg': '输入密码错误'}
20 else:
21 data = {'code': 402, 'msg': '账号/密码不能为空'}
22
23 return json.dumps(data,ensure_ascii=False)
3.2.支付接口--校验token
1 @server.route('/api/payment_v1',methods=['post'])
2 def payment_v1():
3 token = flask.request.values.get('token')
4 amount = flask.request.values.get('amount')
5 if token:#如果token不为空,则去redis中查询用户信息
6 result = op_redis(token)
7 if result:
8 amount = float(amount)
9 result = json.loads(result)
10 userid = result.get('id')
11 update_sql = 'update account_info set balance = balance-%s where id =%s ; '%(amount,userid)
12 print(update_sql)
13 select(update_sql)
14 data = {'code': 0, 'msg': '支付成功'}
15 else:
16 data = {'code': 400, 'msg': '用户未登录'}
17 else:
18 data = {'code':400,'msg':'用户未登录'}
19
20 return json.dumps(data,ensure_ascii=False)
python使用笔记22--mock接口开发的更多相关文章
- Python(七) —— mock接口开发
mock接口开发 接口开发有很多框架,诸如 Django,flask,相比较而言,flask 是轻量级web开发框架,用来开发 mock 接口的不二之选.那你可能会问,什么叫 mock 接口呢?moc ...
- python语言(六)mock接口开发、发邮件、写日志、新Excel操作
一.urllib模块 urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块. url ...
- mock接口开发——flask模块
1.mock接口开发: #1.模拟没有开发好的接口,你可以模拟它,,,,,,,需要调用其他系统的接口 #2.给别人提供数据 2.步骤:1.安装pip install flask 2.导入模块--起服务 ...
- Python 学习笔记(二)开发环境的搭建
安装Python windows 下安装: 下载地址:https://www.python.org/downloads Python的版本 3.x 是趋势 2.x 还在被大量使用 至于使用2.x 还是 ...
- python学习笔记(threading接口性能压力测试)
又是新的一周 延续上周的进度 关于多进程的学习 今天实践下 初步设计的接口性能压力测试代码如下: #!/usr/bin/env python # -*- coding: utf_8 -*- impor ...
- Python入门笔记(22):Python函数(5):变量作用域与闭包
一.全局变量与局部变量 一个模块中,最高级别的变量有全局作用域. 全局变量一个特征就是:除非被删除,否则他们存活到脚本运行结束,且对于所有的函数都可访问. 当搜索一个标识符(也称变量.名字等),Pyt ...
- Python学习笔记22:Django下载并安装
Django它是一个开源Web应用程序框架.由Python书面. 通过MVC软件设计模式,这种模式M,视图V和控制器C. 它最初是一个数字新闻内容为主的网站已经发展到管理劳伦斯出版集团.那是,CMS( ...
- python学习笔记22(group)
正则表达式中,group()用来提出分组截获的字符串,()用来分组 import re a = "123abc456" print re.search("([0-9]*) ...
- python学习之flask接口开发,环境变量扩展,网络编程requests
python基础 flask之mock接口 所谓mock接口,其实就是我们在正式接口还没联调或者是测试接口没有正式使用时,自己创建一个模拟接口,来供项目暂时打通功能或者测试流程梳理的桥梁,而我们这儿使 ...
随机推荐
- Step By Step(userdata)
Step By Step(userdata) 在Lua中可以通过自定义类型的方式与C语言代码更高效.更灵活的交互.这里我们通过一个简单完整的示例来学习一下Lua中userdata的使用方式.需要说明的 ...
- AI框架精要:设计思想
AI框架精要:设计思想 本文主要介绍飞桨paddle平台的底层设计思想,可以帮助用户理解飞桨paddle框架的运作过程,以便于在实际业务需求中,更好的完成模型代码编写与调试及飞桨paddle框架的二次 ...
- TVM vs TensorRT比较
TVM vs TensorRT比较 如果理解正确的话,TensorRT和TVM会加快预测速度. TensorRT优化预测GPU和TVM优化预测几乎所有平台支持GPU,ARM,Mobile... 两者在 ...
- Headline 项目总结中
目录 1.项目准备 1.1 rem适配 1.2 通用样式CSS 1.3删除测试代码 1.4Git托管 2.login页面 2.1 页面布局和表单校验 2.2login页的接口抽取 2.5.loadin ...
- Android客户端网络预连接优化机制探究
一.背景 一般情况下,我们都是用一些封装好的网络框架去请求网络,对底层实现不甚关注,而大部分情况下也不需要特别关注处理.得益于因特网的协议,网络分层,我们可以只在应用层去处理业务就行.但是了解底层的一 ...
- 【渗透实战】记一次艰难的内网漫游第四期_蹭我WIFI?看我如何利用组合拳日进蹭网者内网
/文章作者:Kali_MG1937 CSDN博客ID:ALDYS4 QQ:3496925334/ 内网漫游系列第三期:[渗透实战]记一次艰难的内网漫游第三期_我是如何利用APT攻击拿到内网最高权限的 ...
- 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记番外(1) - JLinkScript妙用
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记番外篇之JLinkScript妙用. JLinkScript 文件是配套 J-Link 调试器使用的脚本,这个脚本适 ...
- 如何使用perf进行程序分析
1.安装. sudo apt-get install linux-tools 如果提示没有可安装候选.请输入: sudo apt-get install linux-perf-version 其中ve ...
- 解放生产力,自动化生成vue组件文档
一.现状 Vue框架在前端开发中应用广泛,当一个多人开发的Vue项目经过长期维护之后往往会沉淀出很多的公共组件,这个时候经常会出现一个人 开发了一个组件而其他维护者或新接手的人却不知道这个组件是做什么 ...
- 【NLP学习其三】在学习什么是嵌入之前,你应该了解什么是词语表征
在了解什么是嵌入(embeddings)之前,我们需要先搞清楚一个词语在NLP中是如何被表示的 注:本次不涉及任何具体算法,只是单纯对概念的理解 词汇表征 One-Hot 词汇的表示方法有很多,最有名 ...