金字塔 - 在每个请求和渲染中包含用户对象?

时间:2014-01-17 23:05:39

标签: pyramid

在我的网站中,我有一个用户面板,显示有关用户的信息(如果他没有登录,则显示自定义消息)。我想知道如何在每个模板中访问用户对象? (比如Django的 CONTEXT_PROCESSORS )。 我知道我可以 add_request_method()到我的配置对象,但据我所知它只会在请求中使用户的对象可用,但我必须每次手动将它添加到返回的上下文 - 不好。 也许我应该将用户的对象添加到会话中? 这样做的正确方法是什么?

2 个答案:

答案 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自动获得。

您在请求对象不可用的情况下有哪些示例?