2014-01-29 2 views
2

현재 Django REST 프레임 워크로 실행중인 multipart/form-data를 사용하여 POST 요청을 받고자합니다. 성공적으로 작동하는 대화 형 API 화면을 통해 일부 테스트 요청을 성공적으로 마쳤습니다. 그런 다음 이러한 세션을 비 세션 기반 인증 전략을 사용하여 변환하려고 시도하고 일관되게 오류가 발생했습니다. 내가 보낸 요청은 형식은 다음과 같습니다왜이 장고 REST API에 POST 할 수 없습니까?

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."]} 

예상대로 - 실제로 장치 인수를 수락하고 누락 된 항목의 오류 만 발생시킵니다. 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)

이 HTTP/multipartparser.py 내에서 장고 코어에서 다음 코드에 달려 - parse_boundary_stream에가 :

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

개발 목적으로 (그리고 그것은 쉽게 될 수 있기 때문에 장고는 고객보다 끝에서 어 나는 위의 라인을 전환했습니다) ... 패치 :

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

이 업데이트 된 코드는 HTTP/1 제 19.3의 권장 사항을 따른다.1 사양을 허용하고 CRLF 대신 LF를 받아들이면 - 장고 코어에 포함하기에 적합한 지 알아보기 위해 노력하겠습니다.

편집 : 참고로

, 패치가 GitHub의에 최대입니다 : 아이디어에 대한 https://github.com/tr00st/django/commit/9cf6075c113dd27e3743626ab0e18c6616488bd9

0

잘못된 멀티 파트 게시물 데이터 때문일 수 있습니다.

또한 MultiPartParser이 설치되어 있지 않을 수도 있지만이 경우에는 보통 415 Unsupported Media Type 응답이 표시 될 것으로 예상하므로 그럴 것 같지 않습니다. 나는 "\ n을"로 내용을 통해 보내 사용하고 libs와 요청 보낸 사람 : 예 -

+0

감사합니다. 지금까지 두 가지를 모두 제외하려고 시도했습니다. 다중 부분 본문 (및 Content-Type 헤더)은 API 브라우저의 "HTML 양식"섹션에서 생성 된 요청에서 제외되므로 유효해야하며 response.parsers list에 MultiPartParser 객체 ()가 포함되어 있습니다. MultiPartParser의 입력에 특별한 제한이 없다고 가정하고 있습니까? – tr00st

관련 문제