代码之家  ›  专栏  ›  技术社区  ›  luc

如何与Django建立私人下载区?

  •  10
  • luc  · 技术社区  · 17 年前

    我想在Django支持的网站上实现一个私有下载区。用户必须以适当的权限登录才能获得一些静态文件。

    您建议如何编写此功能。有什么窍门吗?

    提前谢谢

    更新: 可能是因为我的英语不好,或者我对这个体系结构缺乏了解(这就是我问的原因),但我的问题是:如何确保静态文件(由常规Web服务器提供,不需要Django)访问由Django身份验证控制。 我会更仔细地阅读django文档,但我不记得有现成的解决方案。

    更新2:我的主机提供商只允许FastCGI。

    3 回复  |  直到 14 年前
        1
  •  10
  •   emeryc    17 年前

    所以,搜索我找到的 this 讨论主题。

    有三件事说你可能感兴趣。

    首先是巨蟒 method
    然后是国防部 method

    这两个看起来都不太好。

    更好的是x-sendfile头文件,它不是完全标准的,但至少在apache和lighttpd中工作。

    从中偷窃 here ,我们有以下内容。

    @login_required
    def serve_file(request, context):
        if <check if they have access to the file>:
            filename = "/var/www/myfile.xyz" 
            response = HttpResponse(mimetype='application/force-download') 
            response['Content-Disposition']='attachment;filename="%s"'%filename
            response["X-Sendfile"] = filename
            response['Content-length'] = os.stat("debug.py").st_size
            return response
        return <error state>
    

    这应该是你想要的。只要确保在任何您碰巧使用的地方都打开X-SENDFILE支持。

        2
  •  3
  •   luc    14 年前

    xsendfile似乎是正确的方法,但它的设置看起来有点复杂。我决定用一种更简单的方法。

    基于Emeryc答案和Django片段 http://www.djangosnippets.org/snippets/365/ ,我已经编写了以下代码,它似乎可以满足我的需要:

    @login_required
    def serve_file(request, filename):
        fullname = myapp.settings.PRIVATE_AREA+filename
        try:
            f = file(fullname, "rb")
        except Exception, e:
            return page_not_found(request, template_name='404.html')
        try:
            wrapper = FileWrapper(f)
            response = HttpResponse(wrapper, mimetype=mimetypes.guess_type(filename)[0])
            response['Content-Length'] = os.path.getsize(fullname)
            response['Content-Disposition'] = 'attachment; filename={0}'.format(filename)
            return response
        except Exception, e:
            return page_not_found(request, template_name='500.html')
    
        3
  •  1
  •   marcc    17 年前

    有很多关于如何在Django中启用身份验证的教程。你需要帮助吗?如果是,开始 here .

    下一步是创建一个列出文件的视图。所以,这样做,这都是基本的django。如果此步骤有问题,请返回并通过 Django tutorial . 你会明白的。

    最后,回到第一个链接(这里是: authentication docs )仔细看看登录所需的装饰器。用这个装饰器保护你的视野。

    这些都是很基本的姜戈风格。如果你做了这件事 具体的 问题,贴在这里。但你提出了一个非常开放的问题,所以这不是一个获得帮助的好方法。

    推荐文章