Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:在自定义URL后面服务媒体_Python_Django_Url Rewriting_Nginx - Fatal编程技术网

Python Django:在自定义URL后面服务媒体

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-其他信息

所以我当然知道通过Django提供静态文件会让你直接下地狱,但我不知道如何使用自定义url来屏蔽使用Django的文件的真实位置。但我接受的答案似乎是“错误”的做事方式

URL.py:

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