无法从 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 发送密码重置电子邮件

Django—Form两种保留用户提交数据的方法

如何使用 Axios 将 CSRF Coo​​kie 从 React 发送到 Django Rest Framework

无法发送电子邮件 - Django

无法使用 Django REST 框架从多个选择元素中发布 JSON 数据