2015-02-24 42 views
2

这里是我的http://localhost:8000/characters/api/users/1?format=json为什么我为我的Django Rest Framework端点获得松散的右括号?

)]}', 
{"id":1,"username":"admin","mage_by_user":[3],"mage_last_updated":"2015-02-11T16:13:16.229Z"} 

通知的)]}',第一线JSON响应。

这里是我的代码被调用创建JSON:

class UserSerializer(serializers.ModelSerializer): 
    mage_by_user = serializers.PrimaryKeyRelatedField(
     many=True, queryset=Mage.objects.all()) 
    mage_last_updated = serializers.ReadOnlyField(
     source='mage_by_user.updated_date') 

    class Meta: 
     model = User 
     fields = ('id', 'username', 'mage_by_user', 'mage_last_updated',) 

进一步测试:

  • 我注意到页面的标题是TypeError at <insert url here>
  • 这种情况与我所有的端点
  • 的。如果我试图访问一个不存在的对象(用户ID = 2的情况下),然后呈现“正常”的DRF,例如:

    {
    详细: “未找到”
    }

任何想法,为什么会发生这种情况?

+0

您是否尝试过使用请求调用API? http://docs.python-requests.org/cn/latest/ 如果你仍然在那里得到括号,那么它就是你的代码。如果没有,这是浏览器做一些奇怪的事情。 – 2015-02-26 09:23:54

+0

@ GooseNinja看到我的回答:http://stackoverflow.com/a/28717667/1075247 – Pureferret 2015-02-26 09:39:03

回答

3

这些字符由Djangular中间件AngularJsonVulnerabilityMiddleware插入,注入Json Vulnerability Protection

一个JSON漏洞允许第三方网站把你的JSON资源URL到一定条件下JSONP请求。为了解决这个问题,你的服务器可以为所有的JSON请求加上前缀字符串")]}',\n"。在将它作为JSON处理之前,Angular会自动去除前缀。

不幸的是,这意味着它打破了各种JSON观众。

+1

Angular JS的动机完全混乱且不合理。他们链接到2008年的报告,并没有提到JSONP,而*实际上并不关于JSONP。 – 2015-02-25 11:28:06

+0

@TomChristie所以'保护'不起作用?它没有意义吗? – Pureferret 2015-02-25 11:32:52

+0

@TomChristie实际上它是关于JSONP的,但它并不是这样调用的,它仍然涉及通过'evil.co.uk'('英语总是坏人)从'friendly.com'填充JSON来*制作JSONP。对?即便如此,他们似乎以一种愚蠢的方式来做,而不是文章推荐的方式。 – Pureferret 2015-02-25 11:46:06

1

对不起,没有更多的帮助,但这看起来像是与REST框架完全无关的东西。绝对没有办法以这种方式呈现JSON响应。

也许你有一个自定义的渲染器配置,这是输出一个格式错误的响应,也许你有一些中间件插入这些字符,也许它是一个问题在客户端或你提出请求的任何环境,或者也可能是别的完全不相关的任何这些。

我想尽可能地缩小问题的范围 - 从视图和序列化程序中移除所有的复杂性,并尝试复制测试用例中的行为。

很可能是因为某种意想不到的集成问题而丢失了一些意想不到的代码错误,

+0

谢谢汤姆,我感谢你看着这个。我会继续关注你提到的事情。 – Pureferret 2015-02-25 10:40:20

+0

找到了。它是防止JSON漏洞的Djangular中间件的一部分。 – Pureferret 2015-02-25 11:23:11