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)