标签: flask-cache

烧瓶缓存:基于模式列出键?

我使用 Flask Cache 插件和 Redis 作为后端来缓存我的 API 响应。假设我有 API 来获取用户并创建这样的用户:

/api/users?page=1  GET
/api/users         POST
Run Code Online (Sandbox Code Playgroud)

GET 结果将以完整 URL 为键进行缓存。创建新用户时,我想删除所有以 开头的键/api/users- 目前我正在这样做,cache.clear()但似乎几乎没有必要。

但是,我似乎找不到用于获取密钥列表的 API。对于redis-py,有一个keys(*pattern)用于此目的的API。Flask Cache 有类似的 API 吗?

python caching redis flask flask-cache

6
推荐指数
1
解决办法
1101
查看次数

如何缓存/记忆我的 SQLAlchemy 函数?

我正在使用 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()
Run Code Online (Sandbox Code Playgroud)

该函数第一次运行(尚未缓存)时它运行良好,但是当它从缓存中获取它时,某些东西会以某种方式搞乱并说它是一个无效的客户端。我不知道它是否错误地缓存了它,或者 @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()
Run Code Online (Sandbox Code Playgroud)

那么,在我看来,我有:

@oauth.clientgetter
def load_client(client_id):
  return Client.get_client(client_id)
Run Code Online (Sandbox Code Playgroud)

但这给出了相同的结果。我使用 redis 作为我的缓存后端,我拥有的键/值是:

1) "flask_cache_Pwd2uVDVikMYMDNB+gVWlW"
2) "flask_cache_api.models.Client.get_client_memver"
3) "flask_cache_http://lvho.st:5000/me"
Run Code Online (Sandbox Code Playgroud)

获取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."
Run Code Online (Sandbox Code Playgroud)

获取flask_cache_api.models.Client.get_client_memver:

"!S'+gVWlW'\np1\n."
Run Code Online (Sandbox Code Playgroud)

python caching memoization flask flask-cache

5
推荐指数
1
解决办法
1846
查看次数

缓存 Flask-登录 user_loader

我有这个。

@login_manager.user_loader
def load_user(id=None):
     return User.query.get(id)
Run Code Online (Sandbox Code Playgroud)

在我介绍 Flask-Principal 之前,它运行良好。

@identity_loaded.connect_via(app)
def on_identity_loaded(sender, identity):

    # Set the identity user object
    identity.user = current_user
    # return
    if hasattr(current_user, 'id'):
        identity.provides.add(UserNeed(current_user.id))

    # Assuming the User model has a list of roles, update the
    # identity with the roles that the user provides
    if hasattr(current_user, 'roles'):
        for role in current_user.roles:
            identity.provides.add(RoleNeed(role.name))
Run Code Online (Sandbox Code Playgroud)

添加它会导致严重的性能问题。SQLALCHEMY_ECHO 显示每次加载静态文件时都会查询 User 表。

#Warning: Dummy Cache
users = {}
@login_manager.user_loader
def load_user(uid=None):
    if uid not in users:
        users[uid] = User.query.get(uid)
    return users[uid] …
Run Code Online (Sandbox Code Playgroud)

python flask flask-sqlalchemy flask-login flask-cache

5
推荐指数
1
解决办法
2585
查看次数

删除Flask-Cache或Flask-Caching中的特定缓存

我在python中使用我的API中的Flask缓存.

目前我正在使用装饰器@app.cache.memoize(cache_memoize_value),我通过调用来冲洗它app.cache.delete_memoized(view)

问题是,memoize它将被缓存n视图而不是特定的时间.如果我想为缓存指定超时,我需要使用装饰器@app.cache.cached(timeout=300)并清除它app.cache.clear().但是,这种清晰的方法将清除一切,而不仅仅是一个特定的观点.

如何在使用缓存装饰器时清除特定视图?

python caching flask flask-cache flask-caching

5
推荐指数
2
解决办法
3145
查看次数

Flask Celery 任务锁定

我正在将 Flask 与 Celery 一起使用,并且我正在尝试锁定特定任务,以便一次只能运行一个任务。在 celery 文档中,它给出了执行此Celery 文档的示例,确保一次只执行一个任务。给出的这个例子是针对 Django 的,但是我正在使用 Flask 我已尽力将其转换为与 Flask 一起使用,但是我仍然看到具有锁的 myTask1 可以多次运行。

我不清楚的一件事是我是否正确使用缓存,我以前从未使用过它,所以所有这些对我来说都是新的。提到但未解释的文档中的一件事是

文档注释:

In order for this to work correctly you need to be using a cache backend where the .add operation is atomic. memcached is known to work well for this purpose.

我不确定这意味着什么,我应该将缓存与数据库结合使用,如果是这样,我该怎么做?我正在使用 mongodb。在我的代码中,我只是为缓存设置了这个设置,cache = Cache(app, config={'CACHE_TYPE': 'simple'})因为这就是 Flask-Cache 文档的Flask-Cache Docs 中提到的

我不清楚的另一件事是,当我myTask1从 Flask 路线内打电话给我时,我是否需要做任何不同的事情task1

这是我正在使用的代码示例。

from flask import (Flask, render_template, flash, redirect, …
Run Code Online (Sandbox Code Playgroud)

python celery flask celery-task flask-cache

5
推荐指数
2
解决办法
3676
查看次数

使用Flask Cache和memcached存储简单的键值对

如何使用Flask Cache存储简单的键值对?像这样的东西:

cache.set('key', 'some value')
cache.get('key')
Run Code Online (Sandbox Code Playgroud)

现在我只使用cache.cached()装饰器存储函数的返回值.该方法接缝工作,但我不知道如何在它自己超时之前手动清除该函数的缓存.

理想情况下,我希望能够根据键设置缓存值,如示例中所示.这可能使用memcached作为后端吗?

python caching flask flask-cache

3
推荐指数
1
解决办法
3466
查看次数

如何使用flask-cache和memcached?

下面是类型为“ simple”的flask-cache的示例,但是如何将memcache与flask-cache一起使用?我需要你的帮助谢谢?

from flask import Flask
import random

# import the flask extension
from flask.ext.cache import Cache

app = Flask(__name__)

#import config setting
app.config["CACHE_TYPE"]="simple"

# register the cache instance and binds it on to your app 
app.cache = Cache(app)

@app.route("/")
@app.cache.cached(timeout=50,key_prefix="hello")  # cache this view for 30 seconds
def cached_view():
    a=random.randint(0,100)
    return str(a)

if __name__ == "__main__":
    app.run(port=5000, debug=True, host='0.0.0.0')
Run Code Online (Sandbox Code Playgroud)

flask flask-extensions flask-cache

2
推荐指数
1
解决办法
5558
查看次数

测试Flask-Cache的缓存命中

cache.memoize用来记忆Flask-Cache的功能。如何获取在修饰函数中设置的缓存键?如何在测试过程中测试该功能是否已缓存?

from flask import Flask
from flask.ext.cache import Cache

app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})

@cache.memoize(timeout=10)
def get_news(nid, lang=None):
    return nid, lang

@app.route('/news/<str:nid>')
def news(news_id):
    return 'News: ' + get_news(news_id)
Run Code Online (Sandbox Code Playgroud)

python caching flask flask-cache

0
推荐指数
1
解决办法
971
查看次数