python学习笔记19:mock接口-flask模块
mock接口就是模拟接口的意思。在接口测试中,一个接口可能依赖另一个接口的功能。模拟第三方数据交互的接口,当第三方的接口没有提供之前,我们自己写mock接口和自己的系统数据对接测试,如果不想让别人连接数据库,可以mock接口,让别人调这个接口看数据。例:测试支付功能接口,而它需要调用第三方服务的接口,如微信支付或支付宝支付接口,因此,可以开发mock接口进行模拟支付时调用第三方接口。
一、安装第三方模块flask
安装命令为:
pip install flask
注:flask是一个轻量级的web开发框架
二、开发接口
1.实例化一个服务server:flask.Flask(__name__)
2.函数前加装饰器@server.route(), 将函数变为一个接口
3.启动服务server:server.run()
1 import flask 2 import json 3 import pymysql 4 server = flask.Flask(__name__) # __name__代表当前python文件, 把当前python文件当成一个服务 5 6 # 连接数据库 7 def op_mysql(sql): 8 connect=pymysql.connect(host='127.0.0.1', 9 user='xxx', 10 password='123456', 11 db='xxx', 12 port=3306, 13 charset='utf8', 14 autocommit=True 15 ) 16 cursor = connect.cursor(pymysql.cursors.DictCursor) 17 try: 18 cursor.execute(sql) 19 except Exception as e: 20 result = {'error':'sql错误'} 21 else: 22 result = cursor.fetchall() 23 finally: 24 cursor.close() 25 connect.close() 26 return result 27 28 # 第一种:get请求 29 @server.route('/api/login') #装饰器,函数就不是普通的函数,变成接口 30 # route里面第一个参数是路径名,第二个参数是请求类型,必须用list这种方式,methods默认不写就是get请求 31 def login(): 32 data ={"code":0,"msg":"登录成功"} 33 return json.dumps(data,ensure_ascii=False) 34 35 # 第二种:获取请求参数 36 @server.route('/api/payment') 37 def payment(): 38 status = flask.request.values.get('status') #获取请求参数 39 if status == 'success': 40 data ={"code":0,"msg":"支付成功","amount":30000} 41 elif status == 'process': 42 data = {"code": 305, "msg": "支付处理中", "amount": 30000} 43 elif status == 'fail': 44 data = {"code": -1, "msg": "失败", "amount": 30000} 45 else: 46 data = {"code": 400, "msg": "支付状态错误"} 47 return json.dumps(data,ensure_ascii=False) 48 49 # 第三种:数据库操作 50 @server.route('/account_data',methods=['post']) 51 def account_data(): 52 account_name = flask.request.values.get('account_name') #获取json 53 result = op_mysql('select * from gtm_account where account="%s";'%account_name) 54 data = {"code":0,"msg":"success","data":result} 55 return json.dumps(data,ensure_ascii=False) 56 57 #启动服务: 必须在所有接口定义完后再定义,否则检测不到之后定义的接口, 接口是无法被运行的 58 server.run(host='0.0.0.0',port=9999,debug=True) 59 # host=0.0.0.0同一局域网内写上你真实的IP就可以访问 60 # debug=True是自动重启的意思,修改代码后服务会重启 61 62 # server.run(port=9999,debug=True) #这种启动方式只能本地IP访问:127.0.0.1
三、小练习
1 import flask,json,pymysql,hashlib,redis,time 2 server = flask.Flask(__name__) 3 4 def op_mysql(sql,one_tag): 5 connect=pymysql.connect(host='127.0.0.1', 6 user='xxx', 7 password='123456', 8 db='xxx', 9 port=3306, 10 charset='utf8', 11 autocommit=True 12 ) 13 cursor = connect.cursor(pymysql.cursors.DictCursor) 14 cursor.execute(sql) 15 if one_tag: 16 result = cursor.fetchone() 17 else: 18 result = cursor.fetchall() 19 cursor.close() 20 connect.close() 21 return result 22 23 def md5(s,salt='zx_session'): 24 s = str(s)+salt #加盐 25 m = hashlib.md5(s.encode()) #加密 26 return m.hexdigest() 27 28 def op_redis(key,value=None,expire=60*60*2): 29 r = redis.Redis(host='127.0.0.1',password='123456',decode_responses=True) 30 if value: 31 r.set(key,value,expire) 32 else: 33 return r.get(key) 34 35 # 注册接口 36 @server.route('/register',methods=['post']) 37 def register(): #app_myuser 38 username = flask.request.values.get('username') 39 password = flask.request.values.get('password') 40 cpwd = flask.request.values.get('cpwd') 41 sql = 'select * from app_myuser where username ="%s";'%username 42 if username and password and cpwd: 43 if password !=cpwd: 44 data = {'code': 400, 'msg': '两次输入密码不一致'} 45 elif op_mysql(sql): 46 data = {'code':401,'msg':'用户已经存在'} 47 else: 48 password = md5(password) 49 insert_sql = 'insert into app_myuser (username,passwd) values ("%s","%s");'%(username,password) 50 op_mysql(insert_sql) 51 data = {'code':0,'msg':'注册成功'} 52 else: 53 data = {'code':400,'msg':'必填参数不能为空'} 54 return json.dumps(data,ensure_ascii=False) 55 56 # 登录接口 57 @server.route('/login',methods=['post']) 58 def login(): 59 username = flask.request.values.get('username') 60 password = flask.request.values.get('password') 61 if username and password: 62 sql = 'select * from app_myuser where username ="%s";' % username 63 result = op_mysql(sql,True) 64 if result: 65 if md5(password) == result.get('passwd'): 66 token = md5(username + str(time.time())) #获取token:用户名+时间戳 67 info = {'username':username,'id':result.get('id')} 68 op_redis(token,json.dumps(info)) #token存到redis里 69 data = {'code':0,'msg':'登录成功','token':token} 70 else: 71 data = {'code':403,'msg':'账号/密码错误'} 72 else: 73 data = {'code': 401, 'msg': '用户不存在'} 74 else: 75 data = {'code': 400, 'msg': '必填参数不能为空'} 76 return json.dumps(data,ensure_ascii=False) 77 78 # 支付接口 79 @server.route('/api/payment',methods=['get']) 80 def payment(): 81 token = flask.request.values.get('token') 82 amount = flask.request.values.get('amount') 83 if token: 84 result = op_redis(token) 85 if result: 86 amount = float(amount) 87 result = json.loads(result) 88 userid = result.get('id') 89 sql = 'update app_myuser set balance=balance-%s where id = %s;'%(amount,userid) 90 op_mysql(sql) 91 data = {'code':0,'msg':'支付成功'} 92 else: 93 data = {'code': 401, 'msg': '未登录'} 94 else: 95 data = {'code':401,'msg':'未登录'} 96 return json.dumps(data,ensure_ascii=False) 97 98 server.run(port=9999,debug=True)