【问题标题】:How can I cache/memoize my SQLAlchemy functions?如何缓存/记忆我的 SQLAlchemy 函数?
【发布时间】:2014-04-11 23:07:31
【问题描述】:

我正在使用 Flask-OAuthlib 并希望使用 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.clientgetter 装饰器以某种方式搞砸了缓存。没有缓存一切正常,客户端有效。我试图像这样移动函数,但得到相同的结果:

class Client(Base):
  __tablename__ = 'client'
  __table_args__ = {'autoload': True}
  user = relationship('User')

  @classmethod
  @cache.memoize(timeout=86400)
  def get_client(cls,client_id):
    return DBSession.query(cls).filter_by(client_id=client_id).first()

那么,在我看来,我有:

@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"

GET flask_cache_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."

GET flask_cache_api.models.Client.get_client_memver:

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

【问题讨论】:

  • 你能解释一下你为什么要memoize你的clientgetter吗?这似乎不是合法的方法

标签: python caching flask memoization flask-cache


【解决方案1】:

尝试颠倒装饰器的顺序:

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

编辑

问题似乎是 Client 对象不能腌制,而 cache.memoize 依赖于对象的腌制能力。因此,在一种情况下,您最终会遇到无效客户端错误(客户端对象没有“存活”picke-dump-then-pickle-load 过程),在另一种情况下,会出现某种缓存错误(静默)防止对象被缓存(我不确定是什么机制导致了这种静默处理)。

无论如何,在我看来,您不应该首先尝试记忆您的客户端对象。

【讨论】:

  • 谢谢。它不会抛出错误,但现在它没有缓存。在 redis 中也没有为它创建键/值。
猜你喜欢
  • 2021-11-24
  • 2017-06-27
  • 1970-01-01
  • 2023-03-30
  • 2016-06-27
  • 2019-12-12
  • 2016-05-19
  • 2012-07-06
  • 2021-02-21
相关资源
最近更新 更多