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

Таким образом, я хочу служить нескольким mp3s от папки в /home/username/music. Я не думал, что это будет таким грандиозным предприятием, но я немного смущен о том, как сделать это с помощью универсальных представлений и моего собственного URL.

urls.py

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

Пример, которому я следую, найден в универсальном разделе представления документации Django: http://docs.djangoproject.com/en/dev/topics/generic-views/ (Это полностью внизу),

Я не на 100% уверен в том, как адаптировать это в соответствии с моими потребностями. Вот мой views.py

def song_download(request, song_id):
    song = Song.objects.get(id=song_id)

    response = object_detail(
        request,
        object_id = song_id,
        mimetype = "audio/mpeg",
    )
    response['Content-Disposition'= "attachment; filename=%s - %s.mp3" % (song.artist, song.title)

    return response

Я имею на самом деле в недоумении то, как передать это, я хочу, чтобы это выложило мой mp3 вместо того, что это делает теперь, который должен произвести .mp3 со всем текущим содержавшим HTML страниц. Мой шаблон должен быть моим mp3? Я должен установить апача для обслуживания файлов, или может Django для получения mp3 от файловой системы (верные полномочия, конечно) и подача это? Если это действительно должно настроить Apache, как я говорю Django это?

Заранее спасибо. Эти файлы - все на HD, таким образом, я ничего не должен "генерировать" на месте, и я хотел бы предотвратить раскрытие местоположения этих файлов если вообще возможный. Простой/song/1234/download был бы фантастическим.

9
задан Juergen 14 April 2015 в 21:32
поделиться

2 ответа

Почему вы хотите сделать это с помощью общего представления? Это очень легко сделать без общих представлений:

from django.http import HttpResponse


def song_download(request, song_id):
    song = Song.objects.get(id=song_id)
    fsock = open('/path/to/file.mp3', 'r')
    response = HttpResponse(fsock, content_type='audio/mpeg')
    response['Content-Disposition'] = "attachment; filename=%s - %s.mp3" % \
                                     (song.artist, song.title)
    return response

Я не уверен, можно ли как-то заставить эту работу работать с универсальным представлением. Но в любом случае использование одного здесь излишне. Без шаблона для рендеринга контекст, который автоматически предоставляется общим представлением, бесполезен.

17
ответ дан 4 December 2019 в 08:15
поделиться

Обслуживание статических файлов с помощью Django - плохая идея, используйте Apache, nginx и т. Д.

https://docs.djangoproject.com/en/dev / howto / static-files / deployment /

1
ответ дан 4 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

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