我想在由django支持的网站上实现私有下载区域。用户必须使用适当的权限登录才能获得一些静态文件。
您建议您撰写此功能。任何提示或技巧?
提前致谢
更新: 也许是因为我的英语不好或我对这个架构缺乏了解(这就是我要问的原因)但我的问题是:如何确保静态文件(由常规网络服务器提供而不需要任何django)访问权限由django身份验证。 我将更仔细地阅读django文档,但我不记得该问题的开箱即用解决方案。
Update2:我的主机提供商只允许使用FastCgi。
答案 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上提出了一个非常开放的问题,这不是获得帮助的好方法。