from django.utils.timezone import utc
import datetime
datetime.datetime.utcnow().replace(tzinfo=utc)#生成utf格林尼治时间
datetime.timedelta(days=14) 生成14天的日期格式的数字
import redis
import datetime
from app01 import models
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from django.utils.timezone import utc
redis_conn = redis.Redis(decode_responses=True)
class TokenAuthenticate(BaseAuthentication):
    def authenticate(self, request):
        token = request.META.get("HTTP_TOKEN")
        rds_token = redis_conn.get(token,1)#这里给个1 防止客户端发送请求是如果不携带token时,redis_conn.get(token)会返回一个None; ret = models.Token.objects.filter(key=token, ).first()这里就会报错
        if rds_token:
            print('缓存')
            return rds_token,token
        ret = models.Token.objects.filter(key=token, ).first()
        if ret :
            created_time = ret.created
            # token剩余有效期时间
            period_of_validity = datetime.timedelta(days=14) + created_time - datetime.datetime.utcnow().replace(
                tzinfo=utc)
            if period_of_validity > datetime.timedelta(days=3):#假如token有效期大于3天,在redis中设置token过期时间为3天对应的秒数
                redis_conn.set(token,ret.user.username,ex=10)
            elif period_of_validity < datetime.timedelta(days=3):
                redis_conn.set(token,ret.user.username, ex=int(period_of_validity.total_seconds()))#,假如剩余时间不足三天把剩余天数转换成剩余秒数
            else:
                raise AuthenticationFailed('token过期')#假如已经没有剩余天数则直接报错,抛出token过期信息
            print('数据库')
            return ret.user,token
        else:raise AuthenticationFailed('token过期')