405 在 Django 中导出 CSV 文件
405 on Exporting CSV file in django
我正在尝试将一些数据导出到可下载的 csv 文件。当我在我的网站上单击 "Export" 按钮时,一切正常,直到我收到 405
响应。 post
方法按预期工作,在 response
中我看到了所有预期数据。下面的过滤 ptocess 也按预期工作。
这里是视图 class:
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>
{% 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
方法并获取我想要的数据。
我认为您需要在 Content-Disposition
定义的文件名部分加上引号。这个:
response['Content-Disposition'] = (
'attachment; filename=raport.csv'
)
应该是这样的:
response['Content-Disposition'] = (
'attachment; filename="raport.csv"'
)
你不应该需要 http_method_names
。一般来说,如果视图中存在相应的方法,Django 视图只会处理对 HTTP 动词的请求 class。因此,由于您的视图有一个 post
方法,这足以告诉 Django 这个视图处理 POST
个请求。
405 响应表示 Method Not Allowed
。
您的模板似乎没有发出 POST
请求。没有看到 getSelected()
功能,我无法确定,但我猜你实际上并没有制作 POST
;您正在制作一个 GET
,并且由于您的视图没有实现 get()
方法,您看到的是 405 响应。
尝试以下操作:
- 删除
http_method_names
- 确保您实际上是从您的模板发出 POST 请求(使用浏览器的开发人员工具检查网络请求)。
我正在尝试将一些数据导出到可下载的 csv 文件。当我在我的网站上单击 "Export" 按钮时,一切正常,直到我收到 405
响应。 post
方法按预期工作,在 response
中我看到了所有预期数据。下面的过滤 ptocess 也按预期工作。
这里是视图 class:
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>
{% 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
方法并获取我想要的数据。
我认为您需要在 Content-Disposition
定义的文件名部分加上引号。这个:
response['Content-Disposition'] = (
'attachment; filename=raport.csv'
)
应该是这样的:
response['Content-Disposition'] = (
'attachment; filename="raport.csv"'
)
你不应该需要 http_method_names
。一般来说,如果视图中存在相应的方法,Django 视图只会处理对 HTTP 动词的请求 class。因此,由于您的视图有一个 post
方法,这足以告诉 Django 这个视图处理 POST
个请求。
405 响应表示 Method Not Allowed
。
您的模板似乎没有发出 POST
请求。没有看到 getSelected()
功能,我无法确定,但我猜你实际上并没有制作 POST
;您正在制作一个 GET
,并且由于您的视图没有实现 get()
方法,您看到的是 405 响应。
尝试以下操作:
- 删除
http_method_names
- 确保您实际上是从您的模板发出 POST 请求(使用浏览器的开发人员工具检查网络请求)。