405 在 django 中导出 CSV 文件

Posted

技术标签:

【中文标题】405 在 django 中导出 CSV 文件【英文标题】:405 on Exporting CSV file in django 【发布时间】:2018-04-09 04:37:18 【问题描述】:

我正在尝试将一些数据导出到可下载的 csv 文件。当我在我的网站上单击“导出”按钮时,一切正常,直到我收到405 响应。 post 方法按预期工作,在 response 我看到所有预期的数据。下面的过滤进程也可以正常工作。

这是视图类:

class ExportInvoicesToCsvView(View, IsSuperuserMixin):
    http_method_names = ['post', 'get']

    def post(self, request, *args, **kwargs):
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = (
            'attachment; filename=raport.csv'
        )

        writer = csv.writer(response, delimiter=';')

        filters = json.loads(self.request.body.decode('utf8'))
        data = Data.objects.filter(filters)

        writer.writerow([
            'data.a', 'data.b', 'data.c', 'data.d', 'data.e'
        ])


        return response

url配置如下:

url(
        r'^invoices-csv/$',
        ExportInvoicesToCsvView.as_view(),
        name='invoices-csv'
    ),

还有html模板:

<a  href="% url 'accountant:bills:invoices-csv' %" type="button" class="btn btn-sm btn-default"
    ng-click="getSelected()">
    <i class="fa fa-files-o fa-2x pull-left"></i>
    &nbsp;% trans 'Exportuj do csv' %
</a>

编辑 这是控制台日志。

Method Not Allowed (GET): /accountant/bills/invoices-csv/
[27/Oct/2017 16:41:12] "GET /accountant/bills/invoices-csv/ HTTP/1.1" 405 0
[27/Oct/2017 16:41:15] "POST /accountant/bills/invoices-csv/ HTTP/1.1" 200 0

正如我所见,使用的方法存在某种问题。尽管如此,我还是能够进入post 方法并获取我想要的数据。

【问题讨论】:

【参考方案1】:

我认为您需要在 Content-Disposition 定义的文件名部分加上引号。这个:

response['Content-Disposition'] = (
        'attachment; filename=raport.csv'
    )

应该是这样的:

response['Content-Disposition'] = (
        'attachment; filename="raport.csv"'
    )

【讨论】:

我的代码似乎有两个问题。我只能接受 1 个答案,但我对此表示赞同,因为它也有帮助。【参考方案2】:

你不应该需要http_method_names。一般来说,如果视图类中存在相应的方法,Django 视图只会处理对 HTTP 动词的请求。所以,既然你的视图有一个post,方法,这就足以告诉Django这个视图处理POST请求。

405 响应意味着Method Not Allowed

您的模板似乎没有发出POST 请求。如果没有看到getSelected() 函数,我无法确定,但我猜你实际上并没有制作POST;您正在创建 GET,并且由于您的视图没有实现 get() 方法,因此您会看到 405 响应。

尝试以下方法:

删除http_method_names 确保您实际上是从模板发出 POST 请求(使用浏览器的开发人员工具检查网络请求)。

【讨论】:

我已将 post 更改为 get 并且它或多或少地开始工作(这次我在 POST 上得到 405)但我可以下载文件了。我会进一步调查。 那么这证明您没有从您的模板发出POST 请求。您的&lt;a&gt; 标签只是指向视图的链接 (GET)。问你自己;为什么我需要POST 据我记忆,它是用于更改服务器上的数据。没错,它应该只是 GET。

以上是关于405 在 django 中导出 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

Excel 在 CSV 导出中导出数百个空列

ruby 在Rails 4中的ActiveAdmin中导出CSV导出

在 laravel 中导出 excel 或 csv 中的多维数组

在 Excel 工作表单元格中导出数据

如何在 django 项目中导入和显示 csv 文件

怎么把数据库里的东西导出为CSV格式的文件