Таким образом, я, конечно, знаю, что обслуживание статических файлов через Django отправит Вас прямо к черту, но я смущен о том, как использовать пользовательский URL для маскирования истинного местоположения файла с помощью Django. Django: Обслуживание Загрузки в Универсальном Представлении, но ответе, который я принял, кажется, "неправильный" способ сделать вещи.
urls.py:
url(r'^song/(?P\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
Это решение работает отлично, но не достаточно отлично это складывается. Как я могу постараться не иметь прямую ссылку на mp3 при тихом обслуживании через nginx/apache?
РЕДАКТИРОВАНИЕ 1 - ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
В настоящее время я могу получить свои файлы при помощи адреса, такие как: http://www.example.com/music/song/1692/download/
Но вышеупомянутый метод является работой дьявола.
Как может, я выполнил то, что я получаю выше, в то время как тихое создание nginx/apache обслуживает медиа? Это - что-то, что должно быть сделано на уровне веб-сервера? Некоторый сумасшедший mod_rewrite?
http://static.example.com/music/Aphex%20Twin%20-%20Richard%20D.%20James%20(V0)/10%20Logon-Rock%20Witch.mp3
РЕДАКТИРОВАНИЕ 2 - ДОПОЛНИТЕЛЬНАЯ ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Я использую nginx для своего frontend и инвертирую прокси назад апач/сервер разработки, таким образом, я думаю, требует ли он действительно своего рода работы mod_rewrite, я должен буду найти что-то, что работало бы с nginx.
Чтобы расширить предыдущие ответы, вы должны иметь возможность изменить следующий код и заставить nginx напрямую обслуживать ваши файлы загрузки, при этом файлы все еще защищены.
Прежде всего, добавьте в файл nginx.conf такое место, как:
location /files/ {
alias /true/path/to/mp3/files/;
internal;
}
(внутренний делает его недоступным напрямую). Затем вам понадобится Django View, вроде этого:
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
, который передаст загрузку файла в nginx.
И httpd , и Nginx имеют способ указать статический файл для обслуживания через заголовок. Однако точный заголовок может быть разным, поэтому лучше указать что-нибудь в настройках, чтобы выбрать метод.
Основная идея состоит в том, чтобы заставить ваше представление Django перенаправлять на безопасный URL-адрес, обслуживаемый вашим медиа-сервером.
См. этот список предложений Грэма Дамплтона, автора mod_wsgi.