废话不多说 直接上代码
# 导入jwt
import jwt
# jwt加密
def encrypt_jwt(datas):
playload = {
# 过期时间
'exp': int((datetime.datetime.now() + datetime.timedelta(seconds=86400 * 7)).timestamp()),
'data': datas
}
# 生成jwt
encode_jwt = jwt.encode(playload, 'qwe123', algorithm='HS256')
r.set('encode_jwt', encode_jwt)
Jwt(jwt=encode_jwt,
expire_time=int((datetime.datetime.now() + datetime.timedelta(seconds=86400 * 7)).timestamp())).save()
return encode_jwt
# jwt解密
def decode_jwt(encode_jwt):
try:
decode_jwt = jwt.decode(
encode_jwt,
'qwe123', algorithms=['HS256'])
return decode_jwt
except Exception as e:
Jwt.objects.filter(jwt=encode_jwt).update(status=0)
return 0
# 很多地方都需要用到,有必要封装成装饰器
# 装饰器封装jwt
def my_decorator(func):
def wrapper(request, *args, **kwargs):
jwt1 = request.GET.get('jwt', '')
jwt = request.data.get('jwt', '')
if jwt1 != '':
if not jwt1:
return HttpResponse('用户未登录')
jwt = decode_jwt(jwt1)
if jwt == 0:
return HttpResponse('请登录')
return func(request, jwt, *args, **kwargs)
else:
if not jwt:
return HttpResponse('用户未登录')
jwt = decode_jwt(jwt)
if jwt == 0:
return HttpResponse('请登录')
return func(request, jwt, *args, **kwargs)
return wrapper
# 调用jwt
class User_show(APIView):
@method_decorator(my_decorator)
def get(self, request, jwt):
username = jwt['data']['username'] # 从jwt中获取得数据
return Response({'code': 200, 'username':username })