3

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

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

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

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

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

4

1 回答 1

4

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

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 的文档中有关于此的部分内容:在登录时做额外的工作或验证

于 2012-11-30T15:41:21.633 回答