405关于在django

时间:2017-10-27 14:22:51

标签: python django csv http-status-code-405

我试图将一些数据导出为可下载的csv文件。当我点击"导出"当我得到405回复时,我的网站上的按钮一切正常。 post方法按预期工作,在response我看到了所有预期的数据。下面的过滤ptocess也按预期工作。

以下是视图类:

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方法并获取我想要的数据。

2 个答案:

答案 0 :(得分:1)

我认为您需要围绕Content-Disposition定义的文件名部分引用。这样:

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

应该是这样的:

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

答案 1 :(得分:1)

您不应该需要http_method_names。一般来说,如果视图类中存在相应的方法,Django视图将仅处理HTTP谓词的请求。因此,由于您的视图有一个post方法,这足以告诉Django此视图处理POST个请求。

405回复意味着Method Not Allowed

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

尝试以下方法:

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