金字塔:根据用户状态覆盖路由规则
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')
彻底检查传入的请求很重要。例如,必须排除包括进程中进一步使用的路由在内的路径,否则应用程序将陷入死循环。
我正在开发一个小型 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')
彻底检查传入的请求很重要。例如,必须排除包括进程中进一步使用的路由在内的路径,否则应用程序将陷入死循环。