无法在Heroku部署Django项目:数据库及Ajax相关报错求助
Django Heroku部署Ajax相关错误排查方案
解决 InvalidCursorName 错误(游标不存在)
- 调整数据库连接存活时间:在
settings.py中修改DATABASES的CONN_MAX_AGE参数,建议设置为30或60(默认是0,即每次请求结束关闭连接),避免长时间持有连接导致游标失效。 - 视图中显式管理数据库事务:如果Ajax对应的视图包含复杂数据库操作,用
transaction.atomic()包裹操作代码,确保事务结束后释放游标和连接:from django.db import transaction def your_ajax_view(request): with transaction.atomic(): # 数据库操作逻辑 - 升级Django版本:部分旧版Django(如2.x)在PostgreSQL环境下存在游标管理bug,升级到3.2以上稳定版可解决此类问题。
解决 relation 'incidentreport_accidentcausation' does not exist 错误(表不存在)
- 强制执行数据库迁移:在Heroku终端执行命令:
heroku run python manage.py migrate --run-syncdb--run-syncdb会补充创建未通过迁移生成的表,避免遗漏迁移步骤。 - 核对本地与生产的迁移文件:确认本地所有迁移文件(
migrations目录下的文件)都已提交到版本库,部署到Heroku后才会执行对应迁移。 - 检查表名拼写:PostgreSQL表名默认小写,确认模型、视图或AJAX请求中引用的表名是否与Django生成的一致(比如
incidentreport_accidentcausation,而非大小写混合的名称)。
Ajax请求额外验证
- 确保CSRF令牌正确传递:在HTML模板中加入
{% csrf_token %},并在AJAX请求中设置请求头:var csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value; $.ajax({ url: '/incidentReport/general', type: 'POST', headers: {'X-CSRFToken': csrftoken}, // 其他参数 }); - 优化视图异常处理:避免在捕获第一个异常后继续执行数据库操作,防止链式错误。可以在视图中添加针对性的异常捕获,提前返回错误响应:
def general_report_view(request): try: # 业务逻辑 except OperationalError as e: if 'cursor' in str(e): return JsonResponse({'error': '数据库连接异常'}, status=500) raise
内容的提问来源于stack exchange,提问作者kimski
相关产品推荐
相关产品推荐

