ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

我如何缓存/存储我的SQLAlchemy函数?

2019-11-22 02:09:43  阅读:247  来源: 互联网

标签:caching flask memoization flask-cache python


我正在使用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."

解决方法:

尝试反转装饰器的顺序:

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

编辑

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

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

标签:caching,flask,memoization,flask-cache,python
来源: https://codeday.me/bug/20191122/2056297.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有