Django: serwowanie mediów za niestandardowym adresem URL

Więc oczywiście wiem, że serwowanie plików statycznych przez Django wyśle cię prosto do piekła, ale jestem zdezorientowany, jak użyć niestandardowego adresu url, aby zamaskować prawdziwą lokalizację pliku za pomocą Django. Django: serwowanie pobierania w ogólnym widoku ale odpowiedź, którą zaakceptowałem, wydaje się być" złym " sposobem robienia rzeczy.

Urls.py:

url(r'^song/(?P<song_id>\d+)/download/$', song_download, name='song_download'),

Views.py:

def song_download(request, song_id):
    song = Song.objects.get(id=song_id)
    fsock = open(os.path.join(song.path, song.filename))

    response = HttpResponse(fsock, mimetype='audio/mpeg')
    response['Content-Disposition'] = "attachment; filename=%s - %s.mp3" % (song.artist, song.title)

    return response

To rozwiązanie działa doskonale ale okazuje się, że nie dość idealnie. Jak mogę uniknąć posiadania bezpośredni link do mp3, a jednocześnie obsługujący przez nginx / apache?

EDIT 1-DODATKOWE INFO

Obecnie mogę pobrać swoje pliki używając adresu takiego jak: http://www.example.com/music/song/1692/download/ Ale wyżej wymieniona metoda jest dziełem diabła.

Jak mogę osiągnąć to, co dostaję powyżej, jednocześnie sprawiając, że nginx/apache służy mediom? Czy jest to coś, co powinno być zrobione na poziomie serwera www? Jakiś szalony mod_rewrite?

http://static.example.com/music/Aphex%20Twin%20-%20Richard%20D.%20James%20(V0)/10%20Logon-Rock%20Witch.mp3

EDYCJA 2-DODATKOWE DODATKOWE INFO

Używam Nginx dla mojego frontend i reverse proxy back Apache/development server więc myślę, że jeśli to wymaga jakiejś pracy mod_rewrite będę musiał znaleźć coś, co będzie działać z nginx.

Author: Community, 2010-04-22

3 answers

Aby rozwinąć poprzednie odpowiedzi, powinieneś być w stanie zmodyfikować poniższy kod i mieć nginx bezpośrednio obsługiwać pliki do pobrania, a jednocześnie mieć pliki chronione.

Przede wszystkim Dodaj miejsce takie jak:

location /files/ {
   alias /true/path/to/mp3/files/;
   internal;
}
Do twojego nginx.plik conf (wewnętrzny sprawia, że nie jest on bezpośrednio dostępny). Następnie potrzebujesz widoku Django coś takiego:
def song_download(request, song_id):
    try:
        song = Song.objects.get(id=song_id)
        response = HttpResponse()
        response['Content-Type'] = 'application/mp3'
        response['X-Accel-Redirect'] = '/files/' + song.filename
        response['Content-Disposition'] = 'attachment;filename=' + song.filename
    except Exception:
        raise Http404
    return response
[2]}który przekaże plik do pobrania nginx.
 17
Author: Frozenskys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-31 10:06:01

Podstawową ideą jest przekierowanie Twojego widoku Django do bezpiecznego adresu URL, który jest obsługiwany przez twój serwer multimediów.

Zobacz tę listę sugestii Grahama Dumpletona, autora mod_wsgi.

 3
Author: Daniel Roseman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-22 08:34:45

Zarówno httpdjak i Nginx mają sposób na określenie statycznego pliku, który ma być obsługiwany przez nagłówek. Dokładny nagłówek jest jednak różny, więc najlepiej umieścić coś w ustawieniach, aby wybrać metodę.

 1
Author: Ignacio Vazquez-Abrams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-22 03:30:07