【问题标题】:Django, passing JSON to frontend, 'str' doesn't have 'iteritems'Django,将 JSON 传递给前端,“str”没有“iteritems”
【发布时间】:2014-02-11 12:10:03
【问题描述】:

我正在以这种方式创建 json 数据:

def get_all_from_database():
    urls = Url.objects.all()
    ips = Ip.objects.all()
    urls_json = serializers.serialize('json', urls)
    ips_json = serializers.serialize('json', ips)
    return urls_json, ips_json

我尝试使用 ajax 将其传递给前端:

@csrf_exempt
def send_results(request):
    if request.is_ajax():
        address = request.POST.get('url')
    urls, ips = get_all_from_database()
    return HttpResponse(urls, ips)

js代码:

$.ajax({
    type: "POST",
    url: "/link_finder/send_results/",
    data: {
        url : web_page,
    },
    success: function(data) {
        alert(data);
    },
    error: function(xhr, textStatus, errorThrown) {
        alert("Please report this error: "+errorThrown+xhr.status+xhr.responseText);
    }

我得到这个错误:

INTERNAL SERVER ERROR500AttributeError at /link_finder/send_results/
'str' object has no attribute 'iteritems'

为什么?我应该改变什么?

【问题讨论】:

  • 您的日志中产生的完整回溯是什么?
  • 你试过使用 json.dumps() 吗?
  • 从终端粘贴日志
  • 我没有登录终端,只是 "POST /link_finder/send_results/ HTTP/1.1" 500 11640

标签: javascript python json django


【解决方案1】:

HttpResponse 只接受 一个 正文参数,您传入两个。

不要创建两个 JSON 字符串,构建一个,使用 a custom serializer 处理多个查询集:

import json
from django.core.serializers.json import DjangoJSONEncoder 
from django.core import serializers
from django.db.models.query import QuerySet


def get_all_from_database():
    urls = Url.objects.all()
    ips = Ip.objects.all()
    return urls, ips

class HandleQuerySets(DjangoJSONEncoder):
     """ JSONEncoder extension: handle querysets """
     def default(self, obj):
         if isinstance(obj, QuerySet):
             return serializers.serialize("python", obj, ensure_ascii=False)
         return super(HandleQuerySets, self).default(obj)

@csrf_exempt
def send_results(request):
    if request.is_ajax():
        address = request.POST.get('url')
    urls, ips = get_all_from_database()
    data = HandleQuerySets().encode({'urls': urls, 'ips': ips})
    return HttpResponse(data, content_type='application/json')

我还为您设置了正确的 Content-Type 标头。

【讨论】:

  • 我试过这个,但它会引发错误:'str' object has no attribute '_meta'
  • @user3156971:没错,事实上,序列化程序只能处理查询集。改用自定义编码器更正。
猜你喜欢
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
相关资源
最近更新 更多