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)

 

posted @ 2020-06-14 19:07  张小歪  阅读(471)  评论(0编辑  收藏  举报