You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django + JWT环境中删除数据库内的过期令牌?

解决DRF SimpleJWT过期AccessToken及关联记录清理问题

错误原因分析

你之前的代码报错是因为AccessToken是用于生成、解析JWT令牌的工具类,不是数据库ORM模型,所以它没有objects属性。真正存储令牌数据的是rest_framework_simplejwt提供的两个数据库模型:

  • OutstandingToken:存储所有已签发的令牌(包括未过期的access/refresh token)
  • BlacklistedToken:存储被加入黑名单的令牌,与OutstandingToken为一对一关联

正确的清理命令

在Django Shell中执行以下命令,即可删除所有过期的OutstandingToken及其关联的BlacklistedToken(默认外键关联设置了级联删除,删除主表记录时子表会自动同步删除):

from rest_framework_simplejwt.models import OutstandingToken, BlacklistedToken
from datetime import datetime

# 删除所有过期的OutstandingToken,关联的BlacklistedToken会被级联删除
OutstandingToken.objects.filter(expires_at__lt=datetime.now()).delete()

如果需要单独清理黑名单中关联过期令牌的记录(可选操作),可以先执行:

# 删除关联过期OutstandingToken的BlacklistedToken
BlacklistedToken.objects.filter(token__expires_at__lt=datetime.now()).delete()

优化建议:自动定期清理

手动清理不是长久之计,建议通过定时任务自动执行清理操作:

  • 使用django-crontab添加定时任务,比如每天凌晨清理一次
  • 或用Celery Beat设置周期性任务,适配分布式部署场景

示例django-crontab配置(在settings.py中):

INSTALLED_APPS = [
    # ...
    'django_crontab',
]

CRONJOBS = [
    # 每天凌晨2点执行清理命令
    ('0 2 * * *', 'django.core.management.call_command', ['clean_expired_tokens']),
]

随后需要创建自定义管理命令clean_expired_tokens,将上述清理逻辑写入命令文件,即可实现定时自动清理。


内容的提问来源于stack exchange,提问作者Moustapha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:54:21