Python Django:在自定义URL后面服务媒体
所以我当然知道通过Django提供静态文件会让你直接下地狱,但我不知道如何使用自定义url来屏蔽使用Django的文件的真实位置。但我接受的答案似乎是“错误”的做事方式 URL.py:Python Django:在自定义URL后面服务媒体,python,django,url-rewriting,nginx,Python,Django,Url Rewriting,Nginx,所以我当然知道通过Django提供静态文件会让你直接下地狱,但我不知道如何使用自定义url来屏蔽使用Django的文件的真实位置。但我接受的答案似乎是“错误”的做事方式 URL.py: url(r'^song/(?P<song_id>\d+)/download/$', song_download, name='song_download'), 这个解决方案工作得很好,但结果证明还不够完美。在仍然通过nginx/apache提供服务的情况下,如何避免直接链接到mp3 编辑1-其他信息
url(r'^song/(?P<song_id>\d+)/download/$', song_download, name='song_download'),
这个解决方案工作得很好,但结果证明还不够完美。在仍然通过nginx/apache提供服务的情况下,如何避免直接链接到mp3
编辑1-其他信息
目前,我可以使用以下地址获取我的文件:
http://www.example.com/music/song/1692/download/
但上述方法是魔鬼的工作
如何在仍然让nginx/apache服务于媒体的情况下实现上述目标?这是应该在Web服务器级别执行的操作吗?一些疯狂的修改
http://static.example.com/music/Aphex%20Twin%20-%20Richard%20D.%20James%20(V0)/10%20Logon-Rock%20Witch.mp3
编辑2-其他附加信息
我将nginx用于我的前端和反向代理回apache/development server,因此我认为如果它确实需要某种mod_重写工作,我必须找到一些可以使用nginx的东西。两者都可以,并且有一种方法可以指定一个静态文件,通过头提供服务。确切的标题会有所不同,因此最好在设置中添加一些内容来选择方法。基本思想是让Django视图重定向到媒体服务器提供的安全URL
请参阅mod_wsgi的作者Graham Dumpleton的建议。要扩展前面的答案,您应该能够修改以下代码,并让nginx直接为您的下载文件提供服务,同时仍然保护文件 首先,添加一个位置,例如:
location /files/ {
alias /true/path/to/mp3/files/;
internal;
}
到nginx.conf文件(内部文件使其无法直接访问)。然后您需要一个Django视图,如下所示:
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。谢谢你们两位。我已经寻找了一段时间的解决方案,并得到了很多噪音!
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