【问题标题】:caching.memoize & response_filter for internal server errors内部服务器错误的缓存.memoize & response_filter
【发布时间】:2020-10-14 21:50:38
【问题描述】:

我正在使用 flask_caching 来缓存我的烧瓶 API 的响应。我在这样的路线上使用装饰器

import random
class Status(Resource):
  @cache.memoize(timeout=60)  # cache for a minute
  def post(self):

    return random.randint(0, 5)

这将在一分钟内返回相同的随机数。但是,如果随机函数(阅读:“路由内的任何功能”)中断,并且路由返回 500 内部服务器错误怎么办?据我所知,flask_caching 会缓存它,并在一分钟内为所有进一步的调用返回错误响应,这不是我想要的。

我读到这个并找到了 response_filter 参数,它可以很容易地添加到装饰器中,似乎是专门为了防止这种情况发生(“用于防止缓存代码 500 响应。”,来自文档:

https://flask-caching.readthedocs.io/en/latest/api.html?highlight=response_filter#flask_caching.Cache.memoize)

@cache.memoize(timeout=60, response_filter=callable_check_for_500(???))

但是,我找不到此用例的示例。它说“如果可调用返回 False,则不会缓存内容。” - 我如何实现这个可调用来检查状态码是否为 500?任何链接或想法表示赞赏

【问题讨论】:

  • 还没有测试过,但是查看文档我会定义一个 def check_500(resp): return '500' in resp 并将参数设置为 response_filter=check_500
  • 不确定如何从 check_500 函数中访问响应对象。奇怪的是,实际上似乎 check_500() 函数是在路由返回某些内容之前执行的。此外,当我尝试处理请求时,它说我正在处理请求上下文,这也没有意义,因为该函数是通过向 api 发送请求来触发的。如果您对如何实现它有任何想法,我将非常感激。

标签: python flask flask-caching


【解决方案1】:

我想出了一个“解决方案”,但我并不完全满意

基本上,check_500() 函数默认获取参数 resp,但它不是完整的响应对象,不幸的是缺少 status_code 属性,就像我预期的那样。

状态码本身在数据中,我只是查看响应的最后一个条目,即返回的所有数据。在我的情况下,它只是返回的 json 为 [0],status_code 为 [-1]。

目前实现如下:

  @cache.memoize(timeout=60, response_filter=check_500)  # cache for a minute

使用上面定义的可调用 check_500 函数

def check_500(resp):
  if resp[-1] == 500:
      return False
  else:
      return True

这与评论中建议的 above_c_level 非常相似,所以非常感谢,但是我建议查看响应的最后一个索引,而不是检查响应数据中是否有 500。感觉还是有点不靠谱,如果有人有更详细的想法,请随时发布另一个答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 2011-07-28
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    相关资源
    最近更新 更多