从响应中删除 CherryPy before_finalize 钩子

Remove CherryPy before_finalize hook from response

我有一个现有的应用程序,我想从挂钩中删除一个 @cherrypy.tools.expires() 以成为 before_finalize 上的 运行。

我有:

  1. 控制器的 GET 装饰有 @cherrypy.tools.expires()
  2. 围绕所有 controllers/handlers 的一些包装器,用于检查用户是否已通过身份验证。如果未通过身份验证,则会引发 401 未授权错误,而不是调用 GET
  3. CherryPy 错误处理程序或类似的东西,假定控制

在第 3 步中,我需要删除 before_finalize 挂钩,因为即使包装器从未执行过 GET,它仍会添加到全局 request对象。

我知道我可以在 cherrypy.serving.request.hooks 中找到这些工具,但是没有简单的方法来确定哪个钩子是正确的,因为它们没有命名。

除了遍历钩子并根据函数名称进行一些猜测之外,还有什么好的方法可以确定我要删除哪个钩子吗?

此代码确实有效,但这似乎...错误:

# Remove any hooks that happen to contain "expires" in the callback's name
hooks = cherrypy.serving.request.hooks['before_finalize']
hooks = filter(lambda hook: 'expires' not in str(hook.callback), hooks)
cherrypy.serving.request.hooks['before_finalize'] = hooks