使用django_cron实现token过期自动登出及Django Cron中获取当前用户信息
核心逻辑澄清
django_cron 是运行在后台的独立定时任务进程,不存在Web请求链路中的「当前登录用户」上下文,你不需要主动获取当前用户,只需要批量遍历所有过期 Token 即可拿到对应用户信息完成登出逻辑。
前置配置:给 Token 添加过期时间字段
DRF 默认的 Token 模型没有过期时间属性,你需要先扩展该模型才能判断 Token 是否过期:
- 自定义带过期时间的 Token 模型
# yourapp/models.py from django.db import models from rest_framework.authtoken.models import Token as DefaultDRFToken class ExpiringToken(DefaultDRFToken): # 存储Token过期时间 expires_at = models.DateTimeField() class Meta: db_table = "expiring_authtoken"
- 配置 DRF 使用自定义 Token 模型
# settings.py REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": [ "rest_framework.authtoken.authentication.TokenAuthentication", ], "AUTHTOKEN_MODEL": "yourapp.ExpiringToken" }
- 登录生成 Token 时写入过期时间
你原有登录逻辑里生成 Token 的部分需要补充expires_at的赋值,比如设置 Token 7天有效期:
from datetime import timedelta from django.utils import timezone # 登录接口生成Token的逻辑片段 user = authenticate(username=username, password=password) if user: token, _ = ExpiringToken.objects.get_or_create(user=user) # 每次登录刷新有效期 token.expires_at = timezone.now() + timedelta(days=7) token.save()
Django Cron 任务实现
编写定时清理任务,遍历所有过期 Token 即可直接获取关联的用户信息:
# yourapp/cron.py from django_cron import CronJobBase, Schedule from django.utils import timezone from yourapp.models import ExpiringToken class ExpiredTokenCleanJob(CronJobBase): # 定义任务执行频率:每1小时执行一次,可根据需求调整 RUN_EVERY_MINS = 60 schedule = Schedule(run_every_mins=RUN_EVERY_MINS) # 全局唯一的任务标识 code = "yourapp.expired_token_clean" def do(self): # 过滤所有已过期的Token expired_tokens = ExpiringToken.objects.filter(expires_at__lt=timezone.now()) for token in expired_tokens: # 直接通过token.user获取对应用户的所有信息 current_user = token.user # 执行你原有的登出逻辑:删除旧Token token.delete() # 其他自定义操作:比如生成新Token、记录登出日志、给用户发通知等,都可以直接用current_user的属性操作
测试定时任务可以直接执行命令:
python manage.py runcrons
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

