如何使用 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 包)
- 所有数据存储在服务器端。每个客户端只有一个 cookie 密钥。
- Recommended approach by the Flask team.
显式存储变量的示例: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.
我正在使用 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 包)
- 所有数据存储在服务器端。每个客户端只有一个 cookie 密钥。
- Recommended approach by the Flask team.
显式存储变量的示例: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.