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

Django Heroku应用数据库CSV下载失效,如何解决?

问题原因及解决方案

你的代码在Heroku上失效主要有三个核心问题:硬编码SQLite连接、依赖本地文件系统、类视图使用错误,以下是针对性修复:

1. 修复视图逻辑(views.py)

核心改进点:

  • 适配Django自带的数据库连接,自动兼容SQLite/PostgreSQL
  • 用内存生成CSV,避免依赖Heroku临时文件系统
  • 修正类视图写法(或改用更简单的函数视图)

方案一:类视图实现

from django.http import FileResponse
from django.views.generic import View
import pandas as pd
from django.db import connection
import io

class DownloadView(View):
    def get(self, request):
        # 用Django数据库连接查询数据,自动适配当前数据库
        df = pd.read_sql("SELECT * FROM formulario_colecao", connection)
        
        # 内存中生成CSV,不写入本地文件
        output = io.StringIO()
        df.to_csv(output, index=False, encoding='utf-8')
        output.seek(0)
        
        # 构造响应返回
        response = FileResponse(io.BytesIO(output.getvalue().encode('utf-8')), as_attachment=True)
        response['Content-Disposition'] = 'attachment; filename="colecao_UFMGAC.csv"'
        return response

方案二:函数视图实现(更简洁)

from django.http import FileResponse
import pandas as pd
from django.db import connection
import io

def download_csv(request):
    df = pd.read_sql("SELECT * FROM formulario_colecao", connection)
    
    output = io.StringIO()
    df.to_csv(output, index=False, encoding='utf-8')
    output.seek(0)
    
    response = FileResponse(io.BytesIO(output.getvalue().encode('utf-8')), as_attachment=True)
    response['Content-Disposition'] = 'attachment; filename="colecao_UFMGAC.csv"'
    return response

2. 修正URL配置(urls.py)

根据你选择的视图类型修改:

  • 如果用类视图:
urlpatterns = [
    path('download/', DownloadView.as_view(), name='baixa'),
]
  • 如果用函数视图:
urlpatterns = [
    path('download/', download_csv, name='baixa'),
]

3. 简化HTML模板(listar.html)

原代码中的<form>标签是多余的(a标签是GET请求,无需POST表单),直接保留按钮即可:

<p>
    <a href="{% url 'baixa' %}" class="btn btn-outline-primary">Download</a>
    <a class="btn btn-outline-primary" href="{% url 'cadastrar_colecao' %}">Adicionar Novo</a>
</p>

关键问题解释

  • 硬编码SQLite连接:部署到Heroku后,数据库切换为PostgreSQL,但你的代码仍尝试连接本地SQLite文件,导致数据库查询失败。使用Django的connection对象会自动读取配置文件中的数据库信息,适配当前环境。
  • 本地文件写入:Heroku的文件系统是临时的,写入的文件会在应用重启后丢失,且部分目录可能没有写入权限。用内存生成CSV完全规避了这个问题。
  • 类视图错误:原代码继承TemplateView却自定义Download方法,且URL配置直接调用类方法,不符合Django类视图的使用规范,必须通过as_view()方法实例化视图。

内容的提问来源于stack exchange,提问作者Mário Henrique

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:50:33