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

无法在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:30:53