如何使用django制作私人下载区?

时间:2009-10-22 18:54:29

标签: python django authentication download

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

您建议您撰写此功能。任何提示或技巧?

提前致谢

更新: 也许是因为我的英语不好或我对这个架构缺乏了解(这就是我要问的原因)但我的问题是:如何确保静态文件(由常规网络服务器提供而不需要任何django)访问权限由django身份验证。 我将更仔细地阅读django文档,但我不记得该问题的开箱即用解决方案。

Update2:我的主机提供商只允许使用FastCgi。

3 个答案:

答案 0 :(得分:10)

所以,搜索我发现了this讨论主题。

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

首先是mod_python method
然后是mod_wsgi method

这两者看起来都不那么好。

更好的是X-Sendfile标头不是完全标准的,但至少在apache和lighttpd中起作用。

来自here的kibbitzing,我们有以下内容。

@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支持。

答案 1 :(得分:3)

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')

答案 2 :(得分:1)

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

下一步是创建一个列出文件的视图。这样做,这是所有基本的Django。如果您在执行此步骤时遇到问题,请返回并浏览Django tutorial。你会得到这个。

最后,请参阅第一个链接(这里是:authentication docs)并仔细查看LOGIN_REQUIRED装饰器。用这个装饰器保护你的视线。

这都是非常基本的Django东西。如果您已完成此操作并且有特定的问题,请在此处发布。但是你在SO上提出了一个非常开放的问题,这不是获得帮助的好方法。