我正在运行nginx / uWSGI并尝试使用'auth.requires_login()'(https://groups.google.com/forum/#!topic/web2py/0j92-sPp4bc)来锁定web2py网站,这样只有登录的用户才能访问它,甚至是/ static下的内容/。如果我用
设置nginx配置文件location ~* /(\w+)/static/ {
root /home/www-data/web2py/applications/;
}
按照文档中的建议,是否会绕过访问控制,并允许任何人查看静态内容?如果我将这一行留在配置文件之外,web2py是否仍会将静态内容共享给登录用户(虽然可能会慢一些)?
答案 0 :(得分:1)
是的,使用该nginx规则将绕过web2py。删除它并让web2py处理/静态/赢得更改,因为这直接来自web2py手册:
http://127.0.0.1:8000/a/static/filename 没有名为" static"的控制器。 web2py将此解释为对名为" filename"的文件的请求。在子文件夹中"静态"应用程序" a"。 下载静态文件时,web2py不会创建会话,也不会发出cookie或执行模型。
因为没有控制器,所以不能直接使用auth.requires_login()来获取静态内容。这是因为/ static /中的文件通常不是访问控制的,否则浏览器将无法获得甚至呈现欢迎或登录页面所需的css,js等。
但是,如果您仍希望对静态文件(即私人pdf文件)进行站点范围的访问控制,您可以这样做:
然后在您的控制器中添加以下内容:
#default.py
import os
auth.requires_login()
def private_static():
filename = os.path.join(*request.args)
allowed = ['private1.pdf', 'private2.pdf'] # have some kind of validation for security!
if not filename in allowed:
raise HTTP(404)
return response.stream(open(os.path.join(request.folder, 'private_static', filename)))
并在您看来如下:
<a href="{{=URL('private_static', args=['private1.pdf'])}}">Private Document</a>
现在访问http://.../private_static/private1.pdf将强制用户在获取静态文件之前登录。