如何配置Django和Cherokee来提供来自Cherokee的媒体(用户上传的)文件,但仅限于在生产时使用@login_required登录的用户。
答案 0 :(得分:0)
创建一个服务文件的Django视图
在此视图上使用@login_required
限制访问
使用标准Python io操作从磁盘读取文件
使用StreamingHttpResponse,以便写入响应没有延迟或内存开销
正确设置响应mimetype
答案 1 :(得分:0)
我会回答我自己的问题
当你使用切诺基时
删除对媒体文件夹的直接访问,使用媒体URL作为localhost / media / ..例如删除提供服务的virtuelhost
在处理Django请求的virtuelserver页面的公共CGI选项中的处理程序选项卡下激活(选中)允许X-Sendfile
假设您有媒体/图片下的用户图片,以保护所有用户只能看到。 (可以根据需要进行修改)
每张用户图片都存储在media / pictures / pk.jpg(1.jpg,2.jpg ..)
中创建视图:
@login_required(redirect_field_name=None)
def media_pictures(request,pk):
response = HttpResponse()
path=os.path.join (settings.MEDIA_ROOT,'pictures',pk+'.jpg')
if os.path.isfile(path):
#response['Content-Type']="" # add it if it's not working without ^^
response['X-Accel-Redirect'] = path
#response['X-Sendfile'] = path # same as previous line,
# X-Accel-Redirect is for NGINX and X-Sendfile is for apache , in our case cherokee is compatible with two , use one of them.
return response
return HttpResponseForbidden()
Cherokee现在负责提供文件,这就是为什么我们检查了允许X-Sendfile ,这不行 这里的路径变量是文件的完整路径,可以是任何地方,只需通过切诺基用户或组读取 4.网址conf 当我们禁用Media文件夹的直接访问时,我们需要使用以前的视图提供从Django访问的URL
例如,要使id为17的用户的图像可访问
<强>本地主机/媒体/图片/ 17.jpg 强>
url(r"^media/pictures/(?P<pk>\d+)\.jpg$", views.media_pictures,name="media_pictures"),
这也适用于Apache,Nginx等,只需将服务器配置为使用X-Sendfile(或X-Accel-Redirect for Nginx),这可以在文档上轻松找到
使用此功能,每个登录的用户都可以查看所有用户的图片,可以在提供文件之前添加其他验证,每个用户检查等等
希望它会帮助某人