事件处理程序中的金字塔重定向

时间:2014-02-02 20:24:56

标签: python pyramid

用户在我的应用程序中第一次登录后,他必须做一些选择。我是通过将他重定向到“配置页面”来实现的。这些选择对于整个网页的存在至关重要,因此应用程序在提交之前不应该做任何事情。 我想创建一个请求侦听器来检查用户是否设置了这些选择,如果没有,它会将他重定向到正确的页面。 我用它做了:

@subscriber(NewRequest)
def has_preferences_set(event):
    request = event.request
    user = request.user
    if not user.preferences:
        raise HTTPFound(location=request.route_url('set_my_preferences'))

但是我的问题很少。首先,这个事件实际上是在一个请求上被调用了6次(更重要的是,它们都不是用于实际请求,2个用于静态文件,4个用于pyramid_toolbar)。第二个是重定向后我得到了这个错误:

  

Firefox检测到服务器正在以永远无法完成的方式重定向此地址的请求

2 个答案:

答案 0 :(得分:2)

查看todopyramid。它会将具有无效首选项的新用户和现有用户重定向到帐户页面以设置其用户首选项。在每次后续登录时,将再次确保有效的用户偏好。

todopyramid

您可以根据需要自定义验证逻辑。 todopyramid运行良好,将您需要的概念封装到常见的模型和视图中。不需要魔法事件处理程序。

todopyramid甚至有一个

答案 1 :(得分:1)

关于重定向失败,这是因为你有无限重定向。当您加载路线'set_my_preferences'时,您的活动会被触发并重新定位。

关于6个请求,所有这些请求在开发时都由Pyramid提供。然而,在生产中,静态文件将(应该)由前面的服务器(例如,nginx)提供,并且不会提供工具栏。

另请注意,在每个请求的另一个表中加载用户首选项时,数据库很重要。如果你真的需要它,你应该缓存它或者其他东西。

这是你在这里的一个奇怪的状态。有些用户没有偏好,有些用户有偏好。您应该为所有用户插入默认首选项,并允许他们更改这些首选项。您将避免许多可能的错误,并减少应用程序中“if not user.preference”的数量。