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.
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.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.
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ę.
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