我使用 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 吗?
我正在使用 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) 我有这个。
@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中使用我的API中的Flask缓存.
目前我正在使用装饰器@app.cache.memoize(cache_memoize_value),我通过调用来冲洗它app.cache.delete_memoized(view)
问题是,memoize它将被缓存n视图而不是特定的时间.如果我想为缓存指定超时,我需要使用装饰器@app.cache.cached(timeout=300)并清除它app.cache.clear().但是,这种清晰的方法将清除一切,而不仅仅是一个特定的观点.
如何在使用缓存装饰器时清除特定视图?
我正在将 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) 如何使用Flask Cache存储简单的键值对?像这样的东西:
cache.set('key', 'some value')
cache.get('key')
Run Code Online (Sandbox Code Playgroud)
现在我只使用cache.cached()装饰器存储函数的返回值.该方法接缝工作,但我不知道如何在它自己超时之前手动清除该函数的缓存.
理想情况下,我希望能够根据键设置缓存值,如示例中所示.这可能使用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) 我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) flask ×8
flask-cache ×8
python ×7
caching ×5
celery ×1
celery-task ×1
flask-login ×1
memoization ×1
redis ×1