如何使用切诺基服务Django媒体用户上传文件,限制记录用户

时间:2014-10-06 04:51:18

标签: django cherokee django-media

如何配置Django和Cherokee来提供来自Cherokee的媒体(用户上传的)文件,但仅限于在生产时使用@login_required登录的用户。

2 个答案:

答案 0 :(得分:0)

创建一个服务文件的Django视图

  • 在此视图上使用@login_required限制访问

  • 使用标准Python io操作从磁盘读取文件

  • 使用StreamingHttpResponse,以便写入响应没有延迟或内存开销

  • 正确设置响应mimetype

答案 1 :(得分:0)

我会回答我自己的问题

当你使用切诺基时

  1. 删除对媒体文件夹的直接访问,使用媒体URL作为localhost / media / ..例如删除提供服务的virtuelhost

  2. 在处理Django请求的virtuelserver页面的公共CGI选项中的处理程序选项卡下激活(选中)允许X-Sendfile

  3. 假设您有媒体/图片下的用户图片,以保护所有用户只能看到。 (可以根据需要进行修改)

  4. 每张用户图片都存储在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),这可以在文档上轻松找到

    使用此功能,每个登录的用户都可以查看所有用户的图片,可以在提供文件之前添加其他验证,每个用户检查等等

    希望它会帮助某人