2013-05-29 20 views
6

Django'yla bir projem var Bazı mp3 dosyalarını yayınlamak istediğim yerde çalışıyorum.Akış sırasında kopuk boru

Bu aynı sorunu vardır: Streaming mp3 files with django, read from a page with <audio>

Anlatayım: Ben akışı bir ogg Django ile istiyorum ve benim html sayfası

bir <audio> etiketiyle ben domain.tld/song/show/X/ gibi bir url var şarkımın kimliği X'dur. VLC ile (doğrudan dosya yolu ile) akabilirim, test sırasında akabilirim (Aldığım şeyi yazıp VLC ile okuyun). Benim tarayıcınızı açın ve ana sayfam ben domain.tld ve url domain.tld/song/show/1/ ile <\audio\> balise yüklediğinizde müvekkilimin bağlantıyı kapattı sanki

Ama, büyük bir kırık boru olsun.

Diğerlerinde, sunucuyu üretime soktuklarında bazı sorunların çözüldüğünü okudum. Bu yüzden, uygulamamı sunucuya aktarıyorum, apache'yi, djangoproject.com'daki gibi django.wgsi ile kullanın.

Django sürüm 1.5 ile Debian 7 üzerinde python 2.7.3 çalıştırıyorum. Orada kodum:

Şarkı/views.py

Benim HTML'de
def playAudioFile(request, pk): 
    f = get_stream_song(pk)# return a pipe from pipes.Template 
    l = f.read() # the file is an ogg get by pydub.com 
    f.close() 
    size_read = 550000 
    sr = size_read 
    while sr == size_read: 
     print "rep" 
     r = l[:size_read] 
     l=l[size_read:] 
     sr = len(r) 
     yield r 
    time.sleep(0.1) 

#url : ~/song/show/X/ 
#@login_required 
def show_song(request, pk): 
     return StreamingHttpResponse(playAudioFile(request, pk), mimetype='audio/ogg',) 

, sadece o vardır:

<audio controls height="100" width="100" preload="auto"> 
    <source src="/.../song/show/1/" type="audio/ogg"> 
    <embed height="50" width="100" src="/.../song/show/1/"> 
    </audio> 

hata gibi görünür:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 86, in run 
    self.finish_response() 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 127, in finish_response 
    self.write(data) 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 215, in write 
    self._write(data) 
    File "/usr/lib/python2.7/socket.py", line 324, in write 
    self.flush() 
    File "/usr/lib/python2.7/socket.py", line 303, in flush 
    self._sock.sendall(view[write_offset:write_offset+buffer_size]) 
error: [Errno 104] Connection reset by peer 
---------------------------------------- 
Exception happened during processing of request from ('127.0.0.1', 46392) 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/SocketServer.py", line 593, in process_request_thread 
    self.finish_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/home/lumy/SPhoque/SonoPhoque/SoPhoque/local/lib/python2.7/site-packages/django/core/servers/basehttp.py", line 150, in __init__ 
    super(WSGIRequestHandler, self).__init__(*args, **kwargs) 
    File "/usr/lib/python2.7/SocketServer.py", line 651, in __init__ 
    self.finish() 
    File "/usr/lib/python2.7/SocketServer.py", line 704, in finish 
    self.wfile.flush() 
    File "/usr/lib/python2.7/socket.py", line 303, in flush 
    self._sock.sendall(view[write_offset:write_offset+buffer_size]) 
error: [Errno 32] Broken pipe 

I Akıntı yapmaya çalıştığımda bunu iki kere aldım.


Düzenleme 15h 29/05:

yaptım önerdi rahan: Kundakçı ve Firefox ayıklayıcıya baktığımızda:

istemcisi yapar:

GET 1 200 OK localhost:8000 537.1KB 4.71s 

Headers 
Response Headersview source 
Date Wed, 29 May 2013 13:08:54 GMT 
Server WSGIServer/0.1 Python/2.7.3 
Content-Type audio/ogg 
Request Headersview source 
Host localhost:8000 
User-Agent Mozilla/5.0 (X11; Linux x86_64; rv:10.0.12) Gecko/20100101 Firefox/10.0.12 Iceweasel/10.0.12 
Accept audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5 
Accept-Language en-us,en;q=0.5 
Connection keep-alive 
Range bytes=0- 
Referer http://localhost:8000/ 

ve ayrıntılar demek tüm belgeler için toplam boyut 1 MB'dir (önbellekten 526 KB)

+0

Müvekkilin/tarayıcı bağlantıyı sonlandırıyor. Bunu kontrol etmelisin. – Rohan

+0

@Rohan with wireshark? firefox hata ayıklayıcısında url için bir yanıt 200 /.../song/show/1/ – Lumy

+0

wireshark kullanabilir veya bir şey varsa FF hata ayıklayıcısını kontrol edebilirsiniz. – Rohan

cevap

0

Ben mevcut çözüm diliyoruz olabilir, ben mp3 akışı için nginx/apache sunucusu kullanmak, bir önerim var, bu gün django görünümünde senin durumda örneğin sendfile olarak bilinen çözüm vardır

def send_file_header(server_type): 
    header = "X-Sendfile" if server_type == "apache" else "X-Accel-Redirect" 
    return header 

@login_required 
def show_song(request, pk): 
    res = HttpResponse() 
    path = "/path/to/secret/x.mp3" 
    response[send_file_header('nginx')] = path 
    response['Content-Type']= "application/octet-stream" 
    response['Content-Disposition'] = "attachment; filename=\"x.mp3\"" 
    return response