所以我想从 /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/