Django部署Heroku生产环境删除用户触发500错误排查问询
问题排查与解决方法
第一步:获取完整错误栈
你当前的Heroku日志只记录了请求状态,没有输出Django的错误回溯,建议优先用以下两种方法拿到具体报错:
- 直接在生产Shell中模拟删除操作:执行
heroku run python manage.py shell进入Django交互环境,执行以下代码:
执行后会直接输出完整的错误回溯信息,可直接定位问题根因。from accounts.models import User # 替换为你要删除的测试用户ID user = User.objects.get(id=xxx) user.delete() - 配置Django日志输出到控制台:在生产环境的settings.py中添加如下日志配置,后续报错会将完整栈信息打印到Heroku日志中:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.request': { 'handlers': ['console'], 'level': 'ERROR', 'propagate': True, }, }, }
大概率根因分析
结合你给出的场景和代码,优先排查以下两点:
- 存在未公开的其他模型关联了User模型,且外键设置了
on_delete=models.PROTECT
你给出的StripeRecord外键设置了SET_NULL,删除用户时不会触发报错,但如果有其他你没贴出来的模型,关联User时用了PROTECT策略,生产环境的用户刚好存在关联的该模型数据,删除时就会抛出ProtectedError导致500。而开发环境的测试用户没有对应关联数据,所以删除正常,完全匹配你现在的现象。 - User模型绑定了
pre_delete/post_delete信号,信号处理逻辑在生产环境触发报错
如果你的代码中给User模型写了删除信号的处理函数,且逻辑里依赖只有生产环境才有的配置/数据,就会出现开发环境删除正常、生产删除失败的情况。 - User模型的date_time字段定义问题(概率较低)
你当前User模型的date_time字段写的是default=datetime.datetime.now(),这种写法会在Django进程启动时就固定默认值,虽然大概率不会影响删除操作,但建议修正为default=datetime.datetime.now(去掉括号,传递函数本身而非执行结果),避免后续出现时间相关的异常。
内容的提问来源于stack exchange,提问作者kaka
相关产品推荐
相关产品推荐

