如何使用 Flask 缓存变量?

How to cache a variable with Flask?

我正在使用 Flask 构建一个 Web 表单,希望用户能够输入多个条目,并让他们有机会在将数据发送到数据库之前使用撤消按钮来后悔输入。我正在尝试使用 Flask-Caching 但未能正确设置它。

我已按照 The Flask Mega-Tutorial 设置 Flask(这是我的第一个 Flask 应用程序)。

+---app
|   |   forms.py
|   |   routes.py
|   |   __init__.py
|   +---static
|   +---templates

我想知道我需要如何配置 Flask 应用程序才能基本上执行以下操作:

cache.add("variable_name", variable_data)
variable_name = cache.get("variable_name")
cache.clear()

在其中一个页面中(使用@app.route装饰器的函数)?

在 app.init.py 我有:

from flask import Flask
from config import Config
from flask_caching import Cache

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

from app import routes

在routes.py我有:

from flask import current_app

我在尝试调用缓存时使用了下面的代码。

current_app.cache.add("variable_name", variable_data)

我在尝试使用表单时得到的是以下错误:

AttributeError: 'Flask' object has no attribute 'cache'

我发现的几乎所有教程都只是将应用程序声明和所有路由放在同一个模块中。但是当我在另一个模块中有路由时,如何访问缓存?

为了在 routes.py 中使用 cache 对象,您必须先导入它(从创建它的地方,即 app/__init__.py):

from app import cache

然后使用它:

cache.add("variable_name", variable_data)

在拼凑了来自互联网的大量信息后,我终于得到了这个解决方案,用于在使用应用程序工厂函数构建的应用程序中使用 Flask-Caching 显式缓存数据 .布局和应用程序工厂设置遵循 Flask 教程。

(在我的特定用例中,我使用 Google 日历 API 并希望缓存为连接和身份验证而构建的服务以及来自查询。无需每次用户与页面交互时都重新查询。)

我的 Flask 应用程序的缩略图:

/.../mysite/
|--- mysite_flask/
|    |--- __init__.py   (application factory)
|    |--- cache.py      (for the flask_caching extension)
|    |--- site.py       (a blueprint, views, and related functions)

__init__.py:

from flask import Flask

def create_app(test_config=None):
    # create and configure app as desired
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_mapping(
        ...
    )

    # check whether testing and for instance folder
    ...

    # importing and initializing other blueprints and views
    ...

    # import site blueprint, views, and functionality
    from . import site
    app.register_blueprint(site.bp)
    app.add_url_rule('/', endpoint='index')

    # Extensions
    # import cache functionality
    from .cache import cache
    cache.init_app(app)

    return app

cache.py

from flask_caching import Cache
cache = Cache(config={'CACHE_TYPE': 'SimpleCache'})

site.py

# Other required imports
...
from .cache import cache

bp = Blueprint('site', __name__)

# other views and functions
...

@bp.route('/book', methods=('GET', 'POST'))
def book():
    # Connect to calendar or fail gracefully
    service = cache.get("service") # now the cache is available within a view
    if service is None: # service hasn't been added to cache or is expired
        try: # rebuild the service to connect to calendar
            service = connectToCalendar() # uses google.oauth2 and googleapiclient.discovery
            cache.set("service", service) # store service in cache
            g.error = False
        except Exception as e:
            flash(e)
            g.error = True
            return render_template('site/book.html') # jinja2 template that checks for g.error

    # remaining logic for the 'book' view
    ...

    # Cache results of queries
    if cache.get("week_{}".format(offset)) is None:
        # get new results
        week = getWeek(service)
        cache.set("week_{}".format(offset), week)
    else:
        week = cache.get("week_{}".format(offset))

    return render_template('site/book.html', <...arguments...>)

1 客户端缓存(内置)

  • 所有会话数据作为 Cookie 存储在客户端。

显式存储变量的示例:username

from flask import Flask, session, request 

app = Flask(__name__)
app.config["SECRET_KEY"] = "any random string"

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        session["username"] = request.form["username"]
    # to get value use session["username"]

2 服务器端缓存 -(Flask-Caching 包)

显式存储变量的示例:username

from flask import Flask, request 
from flask_caching import Cache

app = Flask(__name__)
app.config["SECRET_KEY"] = "any random string"
app.config["CACHE_TYPE"] = "SimpleCache" # better not use this type w. gunicorn
cache = Cache(app)

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        cache.set("username", request.form["username"])
    # to get value use cache.get("username")

如果是带 gunicorn 的多线程服务器,我刚刚测试过最好的方法是 ['CACHE_TYPE'] = 'FileSystemCache' 采取 look here.