The*_*ing 21 python django nginx url-rewriting
所以我当然知道通过Django提供静态文件将直接送你到地狱但我很困惑如何使用自定义网址使用Django掩盖文件的真实位置. Django:在通用视图中提供下载,但我接受的答案似乎是"错误的"做事方式.
urls.py:
url(r'^song/(?P<song_id>\d+)/download/$', song_download, name='song_download'),
Run Code Online (Sandbox Code Playgroud)
views.py:
def song_download(request, song_id):
song = Song.objects.get(id=song_id)
fsock = open(os.path.join(song.path, song.filename))
response = HttpResponse(fsock, mimetype='audio/mpeg')
response['Content-Disposition'] = "attachment; filename=%s - %s.mp3" % (song.artist, song.title)
return response
Run Code Online (Sandbox Code Playgroud)
事实证明,这种解决方案非常完美,但并不完美.如何在仍然通过nginx/apache服务的同时避免直接链接到mp3?
编辑1 - 附加信息
目前我可以使用如下地址获取我的文件:
http://www.example.com/music/song/1692/download/
但上面提到的方法是魔鬼的工作.
如何让nginx/apache服务于媒体,我怎样才能完成上面的工作?这是应该在网络服务器级别完成的吗?有些疯狂的mod_rewrite?
http://static.example.com/music/Aphex%20Twin%20-%20Richard%20D.%20James%20(V0)/10%20Logon-Rock%20Witch.mp3
编辑2 - 额外的附加信息
我使用nginx作为我的前端和反向代理返回apache /开发服务器所以我认为如果它确实需要某种mod_rewrite工作,我将不得不找到一些适用于nginx的东西.
Fro*_*kys 20
要扩展以前的答案,您应该能够修改以下代码并让nginx直接为您的下载文件提供服务,同时仍然保护文件.
首先添加一个位置,例如:
location /files/ {
alias /true/path/to/mp3/files/;
internal;
}
Run Code Online (Sandbox Code Playgroud)
到你的nginx.conf文件(内部使得这不能直接访问).然后你需要一个像这样的Django View:
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
Run Code Online (Sandbox Code Playgroud)
这将把文件下载交给nginx.
归档时间: |
|
查看次数: |
6442 次 |
最近记录: |