2009-11-24 3 views
1

Django와 RESTful API를 공유하여 mp3를 공유하려고합니다. 바로 장난감 앱입니다. 프로덕션에 들어 가지 않으므로 확장하거나 걱정할 필요가 없습니다. 희망) 저작권 악마에 대해. 이제 내 문제는 내가 장고보기를 HTTP PUT 요청의 끝점으로 만들고 싶다는 것입니다. PUT의 헤더에는 메타 데이터가 포함될 것이며 본문은 독점적으로 바이너리가됩니다.Django에 바이너리 데이터를 푸는 데 문제가 있습니다.

실제 조회수 (맞음)입니다. 유의하시기 바랍니다 로깅 제어 흐름은 내가 특히 강력하지 않을 경우, 올바른 생각 풋() 메소드를 입력하지 있음을 나타냅니다 :이 테스트에서, 내가 장고의 유닛 테스트 프레임 워크를 사용하여 전달하는 unittests를 얻을 수 있었다

class UserSong(RESTView): 
    logging.debug('entering UserSong.put') 
    def put(self, request, username=''): 

     if request.META['Content-Type'] != 'octet/stream': 
      raise Http400() 

     title = request.META['X-BD-TITLE'] if 'X-BD-TITLE' in request.META else 'title unknown' 
     artist = request.META['X-BD-ARTIST'] if 'X-BD-ARTIST' in request.META else 'artist unknown' 
     album = request.META['X-BD-ALBUM'] if 'X-BD-ALBUM' in request.META else 'album unknown' 
     song_data = b6decode(request.raw_post_data) 

     song = Song(title=title, artist=artist, playcount=playcount, is_sample=is_sample, song_data=song_data, album=album) 
     song.save() 

     return HttpResponse('OK', 'text/plain' , 201) 

def __call__(self, request, *args, **kwargs): 
    logging.basicConfig(filename=LOGFILE,level=logging.DEBUG) 
    try: 
     if request.method == 'DELETE': 
      return self.delete(request, *args, **kwargs) 
     elif request.method == 'GET': 
      return self.get(request, *args, **kwargs) 
     elif request.method == 'POST': 
      return self.post(request, *args, **kwargs) 
     elif request.method == 'PUT': 
      return self.put(request, *args, **kwargs) 
    except: 
     raise Http404() 

, 나는 그것이 실제 생활을 정확하게 모방한다고 믿지 않는다. 그래서 열린 httplib을 깨고 PUT을 구성했습니다. 내 URL을 그 상당히 확신 가끔

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 880, in request 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 914, in _send_request 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 719, in send 
    File "<string>", line 1, in sendall 
error: [Errno 32] Broken pipe 

를 얻을 수 있지만

>>>method = 'PUT' 
>>>url = 'accounts/test/songs/' 
>>>f = open('/Users/bendean/Documents/BEARBOT.mp3') 
>>>data = f.read() 
>>>body = data 
>>>headers = {'X-BD-ARTIST' : 'BEARBOT' , 'X-BD-ALBUM':'','X-BD-TITLE':'LightningSPRKS'} 
>>>headers['CONTENT-TYPE'] = 'octet/stream' 
>>>import httplib 
>>>c = httplib.HTTPConnection('localhost:8000') 
>>>c.request(method, url, body, headers) 

내가 얻을 응답이

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 880, in request 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 914, in _send_request 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 719, in send 
    File "<string>", line 1, in sendall 
error: [Errno 54] Connection reset by peer 

꽤되지 않습니다 : 이것은 내가 대화 형으로 실행하는 코드입니다 (GET 처리기가 잘하고, 고맙습니다) 일하고 있습니다. 로깅은 요청이 실제로 처리기 코드에 적용되지 않음을 나타냅니다.

주위를 인터넷으로 검색하면 큰 파일 (이 파일은 3.7MB)을 업로드하는 중에 문제가 httplib에서 오류를 처리하고 있음을 알리는 추적 프로그램을 제공합니다.

그래서 나는 여기 내 깊이가 없다는 것을 인정하는 것을 부끄러워하지 않습니다. 오류의 원인을 어떻게 결정할 수 있습니까? 내 요청을 올바르게 형식화하고 있습니까? (p.s. 또한 동일한 결과로 본문을 b64 인코딩하는 중) 시도 했습니까? 더 큰 의미에서, 내가하고있는 것이 합리적인가? dev 서버의 구성 가능한 설정과 관련이 있습니까? 아파치에이 문제를 해결하려고하면 이러한 문제가 사라질까요? 귀하의 도움은 대단히 감사하겠습니다.

+2

넣을 수있는 장고보기를 게시 할 수 있습니까? 하나의 추측이 django 개발자 서버 (manage.py runserver)를 사용하고 있다면 큰 파일 요청을 처리하지 못할 수도 있습니다. – Purrell

+0

해결 되었습니까? – bentford

답변

0

문제가 dev 서버에서 대규모 요청을 처리하는 것으로 보입니다. mod_wsgi로 아파치에 배포 한 후에이 문제는 사라집니다. 아직도 나를 위해 RESTful 파일 업로드에 대해 열려있는 질문이 많이있다 ...

관련 문제