2015-02-24 43 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