Django: обслуживание медиа позади пользовательского URL

Таким образом, я, конечно, знаю, что обслуживание статических файлов через 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.

21
задан Community 23 May 2017 в 12:32
поделиться

3 ответа

Чтобы расширить предыдущие ответы, вы должны иметь возможность изменить следующий код и заставить 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.

20
ответ дан 29 November 2019 в 21:44
поделиться

И httpd , и Nginx имеют способ указать статический файл для обслуживания через заголовок. Однако точный заголовок может быть разным, поэтому лучше указать что-нибудь в настройках, чтобы выбрать метод.

1
ответ дан 29 November 2019 в 21:44
поделиться

Основная идея состоит в том, чтобы заставить ваше представление Django перенаправлять на безопасный URL-адрес, обслуживаемый вашим медиа-сервером.

См. этот список предложений Грэма Дамплтона, автора mod_wsgi.

3
ответ дан 29 November 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: