如何缓存/记忆SQLAlchemy函数?

2024-04-19 06:59:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用flaskoauthlib,并希望使用FLask Cache做一些缓存/记忆。我的视图上有缓存设置,但缓存此函数时遇到问题:

@oauth.clientgetter
@cache.memoize(timeout=86400)
def load_client(client_id):
  return DBSession.query(Client).filter_by(client_id=client_id).first()

第一次运行函数时(还没有缓存),它运行得很好,但是当它从缓存中获取它时,某些东西会变得一团糟,并说它是一个无效的客户端。我不知道是缓存错误还是@oauth.clientgetterdecorator不知怎么搞砸了缓存。没有缓存,一切正常,客户端是有效的。我试着像这样移动函数,但是得到了相同的结果:

^{pr2}$

那么,在我看来:

@oauth.clientgetter
def load_client(client_id):
  return Client.get_client(client_id)

但结果是一样的。我使用redis作为我的缓存后端,我拥有的键/值是:

1) "flask_cache_Pwd2uVDVikMYMDNB+gVWlW"
2) "flask_cache_api.models.Client.get_client_memver"
3) "flask_cache_http://lvho.st:5000/me"

获取烧瓶缓存\u Pwd2uVDVikMYMDNB+gVWlW:

"!ccopy_reg\n_reconstructor\np1\n(capi.models\nClient\np2\nc__builtin__\nobject\np3\nNtRp4\n(dp5\nS'_sa_instance_state'\np6\ng1\n(csqlalchemy.orm.state\nInstanceState\np7\ng3\nNtRp8\n(dp9\nS'manager'\np10\ng1\n(csqlalchemy.orm.instrumentation\n_SerializeManager\np11\ng3\nNtRp12\n(dp13\nS'class_'\np14\ng2\nsbsS'class_'\np15\ng2\nsS'modified'\np16\nI00\nsS'committed_state'\np17\n(dp18\nsS'instance'\np19\ng4\nsS'callables'\np20\n(dp21\nsS'key'\np22\n(g2\n(S'Iu6copdawXIQIskY5kwPgxFgU7JoE9lTSqmlqw29'\np23\nttp24\nsS'expired'\np25\nI00\nsbsVuser_id\np26\nL4L\nsVname\np27\nS'Default'\np28\nsV_default_scopes\np29\nS'email'\np30\nsVclient_id\np31\ng23\nsV_redirect_uris\np32\nS'http://localhost:8000/authorized/'\np33\nsVactive\np34\nI1\nsVclient_secret\np35\nS'Vnw0YJjgNzR06KiwXWmYz7aSPu1ht7JnY1eRil4s5vXLM9N2ph'\np36\nsVdescription\np37\nNsb."

获取烧瓶缓存_客户端.api.获取客户机内存:

"!S'+gVWlW'\np1\n."

Tags: 函数clientid客户端flaskcachedefload
1条回答
网友
1楼 · 发布于 2024-04-19 06:59:17

试着颠倒你的装饰师的顺序:

@cache.memoize(timeout=86400)
@oauth.clientgetter
def load_client(client_id):
  return DBSession.query(Client).filter_by(client_id=client_id).first()

编辑

问题似乎是Client对象不可pickle,而cache.memoize依赖于对象的pickle能力。因此,在一种情况下,最终会出现一个无效的客户机错误(客户机对象没有在picke dump然后pickle load进程中“幸存下来”),而在另一种情况下,会出现某种缓存错误(静默地)阻止对象被缓存(我不确定是什么机制导致这种静默处理)。在

在任何情况下,在我看来,首先你不应该试图记住你的客户机对象。在

相关问题 更多 >