2014-01-29 71 views
2

我目前正在嘗試使用運行到Django REST框架的multipart/form-data來獲取POST請求。我已經通過交互式API屏幕成功運行了一些測試請求,這些屏幕很好地工作。然後,我嘗試將這些轉換爲使用基於非會話的身份驗證策略,並且一直存在錯誤。我已經發送的請求的形式爲:任何想法,爲什麼我不能發佈到這個Django REST API?

POST /api/logs/ HTTP/1.1 
Host: host:8080 
Connection: keep-alive 
Content-Length: 258 
Accept: application/json 
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryTOhRsMbL8ak9EMQB 
Authorization: Token -token- 

------WebKitFormBoundaryx6ThtBDZxZNUCkKl 
Content-Disposition: form-data; name="SubmittedAt" 

2014-01-23T10:39:00 
------WebKitFormBoundaryx6ThtBDZxZNUCkKl 
Content-Disposition: form-data; name="Device" 

CheeseDevice 
------WebKitFormBoundaryx6ThtBDZxZNUCkKl-- 

可悲的是,結果是(因爲我已經運行的所有請求):

{"Device": ["This field is required."], "SubmittedAt": ["This field is required."], "LogFile": ["This field is required."]} 

有趣的是,我已經能夠通過對端點發送JSON的塊,他們正在接受符合市場預期,如:

POST /api/logs/ HTTP/1.1 
Content-Type: application/json 
Host: host:8080 
Connection: keep-alive 
Content-Length: 35 
Accept: application/json 
Authorization: Token -token- 

{ 
    "Device": "CheeseDevice" 
} 

返回:

{"SubmittedAt": ["This field is required."], "LogFile": ["This field is required."]} 

正如預期的那樣 - 它實際上接受Device參數,並且僅在丟失的項目上引發錯誤。我會切換到使用JSON,但可惜無法上傳文件...

在此先感謝您的幫助!

編輯:

進一步的調查(即:編寫返回請求的數據顯示,request.DATA是沒有得到填充,由於某種原因,鑑於方法方法我使用調試如下:

def test_create(self, request, pk=None): 
     return Response(request.DATA) 

編輯2:

即使進一步調查(以及丟棄代碼塊爲用於調試的框架),表示該REQ uests在_perform_form_overloading中被捕獲,並且從不碰到MultiPartParser。不知道爲什麼會發生這種情況,但我會嘗試進一步追蹤。

回答

1

每一個級別,我能找到...

貌似問題從行結束莖鑽研下來後(LF)的結局,而HTTP規範要求爲 「\ r \ n」 個結尾(CR,LF)

這取決於在Django的芯下面的代碼,內HTTP/multipartparser.py - 在parse_boundary_stream:

header_end = chunk.find(b'\r\n\r\n') 

對於開發目的(因爲它將成爲方便易用呃修補在Django的結束不是在客戶端......)我已經關掉上面的線:

header_end = chunk.replace("\r\n","\n").find(b'\n\n') 

此更新的代碼如下的HTTP/1的19.3節的建議。1關於容忍應用程序的規範和接受LF而不僅僅是CRLF - 我會試着去看看是否適合包含在Django核心中。

編輯:

作爲參考,這個補丁了GitHub上:https://github.com/tr00st/django/commit/9cf6075c113dd27e3743626ab0e18c6616488bd9

0

這可能是由於格式錯誤的多部分發布數據。

也有可能你沒有安裝MultiPartParser,但我認爲這不會像你通常期望在這種情況下看到415 Unsupported Media Type響應那樣。該庫,並要求發件人我一直在使用,通過爲「\ n」發送內容:即 -

+0

感謝您的想法。我試圖排除這兩個到目前爲止 - 多部分主體(和內容類型頭)從API瀏覽器的「HTML表單」部分生成的請求中拉出,所以應該是有效的,並且response.parsers列表包含MultiPartParser對象(位於0x7fd9d4272a10>處的 tr00st

相關問題