金字塔:根据用户状态覆盖路由规则

Pyramid: Overwrite Routing Rules Based on User Status

我正在开发一个小型 Pyramid 网络应用程序 (Python)。一个要求是用户在一段固定的时间后重置密码,比如每年一次。 (我认为此要求在安全方面没有帮助,但是,客户的内部政策有此要求。)

密码更新应在成功登录后进行。添加登录后显示更新密码对话框的逻辑很容易,但也有可能用户只是使用书签 URL 等导航离开。

我需要做的是根据登录用户的 属性 覆盖路由规则。不过路由配置好像只是Pyramid中的一组静态规则。

有没有办法根据用户状态覆盖路由规则,以便所有对其他视图的请求都forwarded/redirected到密码更新对话框?

假设您有基于 class 的视图,并且您设置了一个会话变量 is_password_recent 如果不到一年前是 True,您可以将以下内容放入每个 class的__init__():

class UserViews:
    def __init__(self, request):
        self.request = request

        if not request.session["is_password_recent"]:
            raise HTTPFound(
                location=request.route_url(
                    "password_renew", _query={"return": request.path}
                )
            )

您也可以通过将逻辑放入 utils 模块中的方法并导入它来 DRY 它。

我找到了使用 Pyramid events 的解决方案:

from pyramid.events import NewRequest, subscriber

@subscriber(NewRequest)
def intercept(event):
    # use event.request to check if an interception/redirect is required
    raise HTTPFound(location='route_to_form')

彻底检查传入的请求很重要。例如,必须排除包括进程中进一步使用的路由在内的路径,否则应用程序将陷入死循环。