afanti 2019-11-12
实在是思维江化啊,没有想到可以给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('重要的数据')