實在是思維江化啊,沒有想到可以給redis設置不同的key值來實現不同key值存儲不同的value值,而一直想着給一個名為token的key值新增不同的數據,並設置過期時間,然而這樣卻不能新增只能做到覆蓋,因此糾結了好一會。狠狠抽自己一巴掌Ծ‸Ծ。
client端
import requests
token = "dnsjabdjsabdnjsabdnjsabjdsbajhdbsa"
###### 1.第一種,對稱加密
# res = requests.get('http://127.0.0.1:8000/asset/', headers={'token':token})
# print(res.text)
###### 2.第二種,不對稱加密
import time
ctime = time.time()
tmp = "%s|%s" % (token, ctime)
import hashlib
m = hashlib.md5()
m.update(bytes(tmp, encoding='utf8'))
res = m.hexdigest()
client_token = "%s|%s" % (res, ctime)
print(client_token)
res = requests.get('http://127.0.0.1:8000/asset/', headers={'token':client_token})
print(res.text)
server端
#三層驗證,保證安全性
def asset(request):
if request.method == 'POST':
print(request.body)
return HttpResponse('ok')
else:
#### 連接數據庫, 獲取存儲的主機名
token = 'dnsjabdjsabdnjsabdnjsabjdsbajhdbsa'
#META里面是http的一些請求頭信息
res = request.META.get('HTTP_TOKEN')
client_token, ctime = res.split('|')
# if token != client_token:
# return HttpResponse('非法的請求!')
#第一關,設置有效時間
server_time = time.time()
if float(server_time) - float(ctime) > 20:
return HttpResponse('第一關:key過期')
#第二關,校驗token值
tmp = "%s|%s" % (token, ctime)
import hashlib
m = hashlib.md5()
m.update(bytes(tmp, encoding='utf8'))
server_token = m.hexdigest()
if server_token != client_token:
return HttpResponse('第二關:非法的請求!')
### 第三關,token只能使用一次,並設置過期時間,防止數據堆積
### decode_responses=True可以使從redis得到的數據不是bytes類型
### django連接redis, 將key發到redis中, 並設置過期時間
r = redis.Redis(host='127.0.0.1', port=6379, db=1,decode_responses=True)
#實現方法,就是這么簡單
if ctime==r.get(client_token):
return HttpResponse('第三關 已經訪問過了')
r.setex(client_token,20,ctime)
return HttpResponse('重要的數據')