使用django-axes实现post_save信号时出现TypeError问题求助
解决django-axes中CombinedExpression与int无法比较的问题
错误原因
你拿到的instance.failures_since_start是Django ORM的CombinedExpression对象,它是未执行的数据库查询表达式,并非直接的整数结果。直接拿它和int对比会触发类型错误,转int操作也无效——因为它还没从数据库获取到实际数值。
解决方法
方法1:使用django-axes官方工具函数获取失败次数
django-axes提供了现成的工具函数统计失败次数,这是最稳妥的方案,无需自己处理查询逻辑:
from axes.utils import get_failures from django.conf import settings # 获取当前实例对应的失败次数 failures = get_failures( ip_address=instance.ip_address, user_agent=instance.user_agent, username=instance.username # 可选:如需按用户名过滤则加上 ) # 和配置中的failure_limit直接比较 if failures >= settings.AXES_FAILURE_LIMIT: # 执行达到限制后的逻辑 else: # 执行普通错误通知逻辑
方法2:手动执行表达式获取数值
如果不想用工具函数,可以手动触发表达式计算,得到实际整数:
from django.db import connection from axes.models import AccessAttempt # 执行表达式计算拿到实际失败次数 failures = instance.failures_since_start.evaluate( instance, AccessAttempt.objects.db_manager(instance._state.db), connection=connection ) # 现在可正常与int比较 if failures >= your_failure_limit: # 后续逻辑
注意事项
- 优先选择方法1,官方工具函数会自动适配axes的统计规则(比如按IP/用户名/用户代理统计),避免自定义查询出错。
failure_limit建议直接从settings.AXES_FAILURE_LIMIT获取,不用硬编码数值,保持配置统一。
内容的提问来源于stack exchange,提问作者fjkg
相关产品推荐
相关产品推荐

