在我的网站中,我有一个用户面板,显示有关用户的信息(如果他没有登录,则显示自定义消息)。我想知道如何在每个模板中访问用户对象? (比如Django的 CONTEXT_PROCESSORS )。 我知道我可以 add_request_method()到我的配置对象,但据我所知它只会在请求中使用户的对象可用,但我必须每次手动将它添加到返回的上下文 - 不好。 也许我应该将用户的对象添加到会话中? 这样做的正确方法是什么?
答案 0 :(得分:3)
Pyramid中您需要的是身份验证策略。这可以像将这些行添加到__init __。py:
一样简单from pyramid.authentication import AuthTktAuthenticationPolicy
def main(global_config, **settings):
...
authentication_policy = AuthTktAuthenticationPolicy('some_key')
config = Configurator(settings=settings,
authentication_policy=authentication_policy)
...
一旦启用了身份验证策略,您就可以使用pyramid.security中的“忘记”和“记住”功能来允许用户登录和注销。这是一个处理登录的简化视图函数:
from pyramid.security import remember, forget
def sign_in(request):
username = request.POST.get('username')
password = request.POST.get('password')
if username and User.verify_password(username, password):
headers = remember(request, username)
else:
headers = forget(request)
return HTTPFound(location=request.route_url('index'),
headers=headers)
你需要改变一些东西 - 也许你的User对象没有'verify_password'方法;也许你想在成功登录时重定向到另一个页面,等等。但这是开始使用的东西。
然后在我的基本模板中,我可以添加:
<%
from pyramid.security import authenticated_userid
user_id = authenticated_userid(request)
%>
使user_id可用于模板,然后:
% if user_id:
<p>Welcome ${user_id}</p>
% else:
<p>Please login <a href="${request.route_url('login')}">here</a></p>
% endif
注意我正在使用Mako语法 - 如果您使用的是不同的模板引擎,则应检查其导入,条件等的语法。
我已经给出了不同部分的基本轮廓以及它们如何拼凑在一起,但Pyramid具有强大的身份验证功能,我鼓励您阅读一些有关它如何工作的内容:
金字塔文档:http://docs.pylonsproject.org/projects/pyramid/en/latest/api/authentication.html
Pyramid的身份验证政策的优秀演示: https://github.com/mmerickel/pyramid_auth_demo
答案 1 :(得分:1)
我知道您已经提到了add_request_method()
解决方案,但这是我在adding a user object to the request上完成本教程之后的最终结果。
我可能不会在我的金字塔应用程序中做任何事情,但基本上每个视图和模板都有一个请求对象作为其中的一部分,因此在任何模板中我都可以<% request.user %>
并拥有我的用户对象和可用的一切部分。我甚至有一些辅助方法和关系刚刚通过,并且可以request.user
自动获得。
您在请求对象不可用的情况下有哪些示例?