无法从 Django 发送 HttpResponse
Posted
技术标签:
【中文标题】无法从 Django 发送 HttpResponse【英文标题】:Unable to send HttpResponse from Django 【发布时间】:2015-06-30 03:58:06 【问题描述】:我正在尝试将带有 .csv 格式的附加标头的 JSON 格式发送到前端以供下载。 在发送 HTTP 响应时,我面临“不是 JSON 可序列化”错误。
我的views.py
文件:
from datetime import datetime
from django.shortcuts import render
from django.http import HttpResponse
import json as simplejson
import random
import csv
def DownloadEventLog(request):
downloadeventlog = "[\"severity\":\"0\",\"description\":\"USB Connected\",\"date\":\"01/01/2015\",\"time\":\"11:35:20\",\"severity\":\"3\",\"description\":\"USB Disconnected\",\"date\":\"01/01/2015\",\"time\":\"10:30:19\"]";
data = simplejson.loads(downloadeventlog)
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="eventlog.csv"'
writer = csv.writer(response)
writer.writerow(data[0].keys())
for row in data:
writer.writerow(row.values())
print response
return HttpResponse(simplejson.dumps(response), content_type = "application/json")
打印响应 cmd 正在打印:
Content-Type: text/csv
Content-Disposition: attachment; filename="eventlog.csv"
date,time,severity,description
01/01/2015,11:35:20,0,"USB Connected"
02/02/2015,10:30:19,3,"USB Disconnected"
但是最后一行抛出如下错误:
TypeError at /eventlog/downloadeventlog
<django.http.response.HttpResponse object at 0x9c059ec>is not JSON serializable
Request Method: POST
Request URL: http://127.0.0.1:8001/eventlog/downloadeventlog
Django Version: 1.7.1
Python Version: 2.7.3
【问题讨论】:
<Django object > is not JSON serializable的可能重复 【参考方案1】:simplejson 和 json 不能很好地处理 django 对象。
Django 内置的serializers 只能序列化由 django 对象填充的查询集:
**** To use ****
data = serializers.serialize('json', self.get_queryset())
return HttpResponse(data, mimetype="application/json")
希望有帮助
【讨论】:
【参考方案2】:你可以只返回response
,你不需要将它包裹在HttpResponse
中。
return response
【讨论】:
是的,如果只是为了下载,我认为你应该在定义响应时使用 StreamingHttpReponse()。 浏览器会发现你返回了Content-Disposition: attachment; filename="eventlog.csv"
的可下载文件,这不是前端的工作
是的,它成功了,感谢我根本不需要将它作为 HttpResponse 发送。我只是想将响应发送到前端,使文件可下载。
如果有帮助别忘了接受我的回答,我最近正在努力提高自己的声誉。 ^_^【参考方案3】:
你应该在这里使用 django 的序列化器:https://docs.djangoproject.com/en/dev/topics/serialization/
这里有相关问题:<Django object > is not JSON serializable
【讨论】:
以上是关于无法从 Django 发送 HttpResponse的主要内容,如果未能解决你的问题,请参考以下文章
我无法从 JQuery ajax 调用中加载部分 Django 模板
如何使用 django-rest-auth 和 Mailgun 从 Django 发送密码重置电子邮件
如何使用 Axios 将 CSRF Cookie 从 React 发送到 Django Rest Framework