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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:46:09