2013-07-24 30 views
5

我有以下看法:Django的REST框架不反序列化作爲原始JSON傳遞數據

class Authenticate(generics.CreateAPIView): 
    serializer_class = AuthSerializer 

    def create(self, request): 
     serializer = AuthSerializer(request.POST) 
     # Do work here 

如果數據被作爲一種形式然而過去了,如果數據被作爲原始JSON通過這種運作良好序列化程序會將其所有字段設置爲無實例化。文檔確實提到應該有任何特定的處理原始JSON參數的東西。

任何幫助,將不勝感激。

UPDATE

我在爲了使可瀏覽API工作下面的解決預期將原料JSON的時候,但我相信一定會有更好的辦法。

def parse_data(request): 
    # If this key exists, it means that a raw JSON was passed via the Browsable API 
    if '_content' in request.POST: 
     stream = StringIO(request.POST['_content']) 
     return JSONParser().parse(stream) 
    return request.POST 


class Authenticate(generics.CreateAPIView): 
    serializer_class = AuthSerializer 

    def create(self, request): 
     serializer = AuthSerializer(parse_data(request)) 
     # Do work here 
+0

你有什麼錯誤?或者你真的得到任何錯誤? –

+0

串行器用Nones初始化。問題是Browsable API在'_content'鍵內發送JSON。我已經創建了一個函數來識別這是什麼情況,並將json解析爲字典,但我相信必須有更好的方法。 – Raphael

回答

8

您正在以錯誤的方式訪問請求數據 - request.POST只處理解析表單多部分數據。

改爲使用REST框架的request.data。這將處理表單數據或json數據,或其他任何您配置的解析器。

+0

沒有像框架的創建者自己的答案:) – Raphael

1

我想這就是當你使用Browsable API時的情況。

我認爲你不應該使用可瀏覽API測試JSON請求,使用curl代替:

curl -v -H "Content-type: application/json" -X POST -d '{"foo": 1, "bar": 1}' http://127.0.0.1:8000/api/something/ 

希望它能幫助。

+0

其他開發者期望使用Browsable API來驗證他們的JSON,並且Browsable API有一個標籤可以發佈原始JSON我認爲有一些東西可以使序列化器工作。我已經在該項目的Github頁面上發佈了一個問題。對Serializer的__init__進行一個簡單的檢查就可以解決這個問題,並使其可以直接使用。 – Raphael

+0

不錯,讓我知道結果然後;) –

相關問題