Django-axes报无AXES_HANDLER属性错误的修复方法
问题根因
连环出现AXES_*属性缺失报错,和自定义用户模型、认证业务逻辑无关,核心是两个配置错误:
- 你在
settings.py末尾错误手动调用了django.setup():Django的settings模块由框架在启动流程中自动加载初始化,django-axes依赖启动阶段的配置注入逻辑自动补全所有缺省配置项(包括你现在报错的AXES_HANDLER,以及之前你手动补的一众属性),提前调用django.setup()会打断这个注入流程,导致所有未手动声明的AXES配置都报属性不存在,手动补一个就会漏下一个,永远补不完。 - 大概率存在django-axes版本与Django 3.1不兼容的问题,部分过新或过旧的axes版本对Django 3.1的配置加载逻辑适配有缺陷。
修复步骤
- 直接删除
settings.py最后一行的django.setup(),同时删掉你之前手动补的所有和默认值一致的AXES_*配置(比如AXES_USERNAME_CALLABLE = None、AXES_PROXY_COUNT = None这类你没有修改默认规则的项),这类配置不需要手动声明,框架会自动加载。 - 卸载当前安装的django-axes,安装适配Django 3.1的兼容版本,执行命令:
pip uninstall django-axes -y pip install django-axes==5.39.0
- 执行数据库迁移,生成axes需要的登录失败记录数据表:
python manage.py migrate
- 修正
settings.py里的笔误:把拼写错误的SION_COOKIE_SECURE = True改成SESSION_COOKIE_SECURE = True,否则会话Cookie的安全配置不会生效。 - 最终保留的AXES自定义配置只需要留你确实修改了默认规则的项即可,示例如下:
AXES_ENABLED = True AXES_FAILURE_LIMIT = 3 AXES_COOLOFF_TIME = 0.1 # 锁定时长0.1小时即6分钟 AXES_LOCKOUT_CALLABLE = "Chat.views.lockout" AXES_META_PRECEDENCE_ORDER = [ 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', ]
验证说明
你在views.py中写的lockout回调函数、认证逻辑中传入request=request的写法完全符合官方要求,不需要调整。重启服务后所有属性缺失报错会直接消失,AXES_HANDLER会自动加载默认值axes.handlers.database.AxesDatabaseHandler,登录锁定逻辑可以正常运行。
内容的提问来源于stack exchange,提问作者IceSpeaker
相关产品推荐
相关产品推荐

