python - Django:在通用 View 中提供下载服务

标签 python django file

所以我想从 /home/username/music 中的文件夹中提供几个 mp3。我不认为这有什么大不了的,但我对如何使用通用 View 和我自己的 url 来做到这一点感到有点困惑。

网址.py

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

我下面的示例可以在 Django 文档的通用 View 部分找到: 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,而不是它现在所做的,即输出包含所有当前页面 html 的 .mp3。我的模板应该是我的 mp3 吗?我是否需要设置 apache 来提供文件,或者 Django 是否能够从文件系统中检索 mp3(当然是适当的权限)并提供它?如果它确实需要配置 Apache,我该如何告诉 Django?

提前致谢。这些文件都在 HD 上,所以我不需要当场“生成”任何东西,我想尽可能避免泄露这些文件的位置。一个简单的/song/1234/download 会很棒。

最佳答案

为什么要使用通用 View 来执行此操作?在没有通用 View 的情况下很容易做到这一点:

from django.http import HttpResponse


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

我不确定是否可以通过通用 View 以某种方式使这项工作正常进行。但无论哪种方式,在这里使用一个都是多余的。如果没有要呈现的模板,通用 View 自动提供的上下文将毫无用处。

关于python - Django:在通用 View 中提供下载服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2681338/

相关文章:

python - 导入错误 : 'scipy.misc import imsave' on Google Colaboratory

python - 如何将无维度添加回张量?

python - 是否可以在 Python 中创建一个带有函数的文件?

c++ - 二进制文件加密问题

python - Flask 邮件给出了 celery 的 Pickling 错误

python - 在 Django 模型中制作树结构?

python - 可以使用InstantDjango而不是正常安装吗

python - Apache 寻找 Python 2.6 而不是 2.7

perl - 在 Perl 中递归打开文件

python - 超过 24 小时的日期时间格式