【问题标题】:Pyramid view redirection金字塔视图重定向
【发布时间】:2012-11-18 19:39:46
【问题描述】:

我正在尝试将 Mozilla Persona (browserid) 集成到 Pyramid 应用程序中。登录过程为:

  1. 用户可以通过点击登录按钮登录任何页面
  2. 然后弹出一个显示登录表单
  3. 当用户输入正确的登录名/密码时,弹出窗口会调用 Pyramid 视图来检查用户凭据,如果检查成功则调用 Pyramid 记住函数
  4. browserid javascript 代码然后重新加载当前页面

现在我想处理一个新用户订阅网络应用程序的情况,并呈现一个新视图,要求提供更多详细信息(所需的用户名等)。

由于“记住”函数是由弹出窗口中的 ajax 调用调用的,因此我无法将用户重定向到“/newuser”页面。 因此,每当记住的 browserid 在数据库中没有对应的用户时,每个视图都需要将新用户重定向到“/newuser” url。

有没有办法在调用视图来调用“new_user”视图之前拦截用户请求?或者我的身份验证方法根本不正确,我应该依赖另一种方法?

【问题讨论】:

    标签: python authentication redirect pyramid browserid


    【解决方案1】:

    执行此操作的一种方法是创建一个应在创建用户时引发的异常,并将此异常用作将重定向到新页面的视图的上下文。

    class NewUser(Exception):
        pass
    
    @view_config(context=NewUser)
    def new_user_exception(request):
        return HTTPFound(request.route_path('new_user'))
    

    确保在第一次登录后的第一个请求期间引发异常(例如,在创建用户对象之后),并且用户将被重定向到正确的页面。

    您也可以将欢迎页面的代码直接放在new_user_exception 中,但如果没有重定向,该页面将包含用户询问的 url,无论它是什么。


    另一个解决方案是调整角色部分的完成方式。为此,我猜你正在使用pyramid_persona(我是作者:))。如果不是,我所说的仍然适用,并且会更简单。

    你可以做的是:

    • 更改登录视图,使其在响应中包含一个布尔值,说明这是否是第一次登录。
    • 更改 javascript 以检查此布尔值,如果不是第一次则重新加载页面,如果是则重定向到欢迎页面。

    登录视图的代码可以像这样使用pyramid_persona的登录视图:

    from pyramid_persona.views import login
    
    @view_config(route_name='login')
    def new_login(request):
        response = login(request)
        if response.status == 200: #the login worked
            # tweak the response
        return response
    

    编辑:现在在 pyramid_persona 的文档中有关于此的部分:Do extra work or verification at login

    【讨论】:

    • 感谢您的回答。我想知道哪里是引发 NewUser 异常的更好地方。我现在在 NewRequest 订阅者中调用它,该订阅者检查数据库中的用户 ID。
    • NewRequest 订阅者不是一个坏地方,因为它需要在每个请求中调用。不要忘记将查询的结果放在请求对象中,这样就不用在视图中再做一遍了。
    猜你喜欢
    • 2018-12-24
    • 2017-07-03
    • 2012-12-29
    • 2022-08-10
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多