gpt4 book ai didi

django - 在Django中下载CSV文件

转载 作者:行者123 更新时间:2023-12-04 09:56:45 25 4
gpt4 key购买 nike

我正在尝试使用HttpResponse下载CSV文件,以确保浏览器将其视为附件。我按照here提供的说明进行操作,但是我的浏览器没有提示“另存为”对话框。我无法弄清楚我的功能出了什么问题。感谢所有帮助。

dev savefile(请求):
尝试:
myfile = request.GET ['filename']
文件路径= settings.MEDIA_ROOT +'结果/'
destpath = os.path.join(文件路径,myfile)
响应= HttpResponse(FileWrapper(file(destpath)),mimetype ='text/csv')
response ['Content-Disposition'] ='附件; filename =“%s”'%(myfile)
返回响应
除了Exception以外,err:
errmsg =“%s”%(err)
返回HttpResponse(errmsg)

帕特快乐的一天!

最佳答案

如果文件是静态(即不是专门为此请求生成的),则无论如何都不应该通过django提供文件。您应该配置一些路径(例如/static/)以供您的网络服务器使用,并节省所有django开销。

如果文件是动态,则有2个选项:

  • 在内存中创建它,并通过django提供它。
  • 在磁盘上创建它,并向其返回HttpResponseRedirect,以便您的Web服务器处理下载本身(如果文件很大,则应使用此选项)。

  • 至于动态提供服务,我一直在使用以下代码(这是 ExcelResponse的简化版本)
    import StringIO
    from django.db.models.query import ValuesQuerySet, QuerySet

    class CSVResponse(HttpResponse):

    def __init__(self, data, output_name='data', headers=None, encoding='utf8'):

    # Make sure we've got the right type of data to work with
    valid_data = False
    if isinstance(data, ValuesQuerySet):
    data = list(data)
    elif isinstance(data, QuerySet):
    data = list(data.values())
    if hasattr(data, '__getitem__'):
    if isinstance(data[0], dict):
    if headers is None:
    headers = data[0].keys()
    data = [[row[col] for col in headers] for row in data]
    data.insert(0, headers)
    if hasattr(data[0], '__getitem__'):
    valid_data = True
    assert valid_data is True, "CSVResponse requires a sequence of sequences"

    output = StringIO.StringIO()
    for row in data:
    out_row = []
    for value in row:
    if not isinstance(value, basestring):
    value = unicode(value)
    value = value.encode(encoding)
    out_row.append(value.replace('"', '""'))
    output.write('"%s"\n' %
    '","'.join(out_row))
    mimetype = 'text/csv'
    file_ext = 'csv'
    output.seek(0)
    super(CSVResponse, self).__init__(content=output.getvalue(),
    mimetype=mimetype)
    self['Content-Disposition'] = 'attachment;filename="%s.%s"' % \
    (output_name.replace('"', '\"'), file_ext)

    要使用它,只需使用return CSVResponse(...)传入列表列表,字典列表(具有相同键),QuerySet,ValuesQuerySet

    关于django - 在Django中下载CSV文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2464888/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com