2

我有一个结构如下的烧瓶路线:

@app.route('/rootpath1/<path:path>')
@app.route('/rootpath2/<path:path>', methods=['GET', 'POST'])
@cache.cached()
def rootpath():
    ...

给定页面的 '/rootpath2/' 的 POST 通常从缓存中检索(当存在缓存值时),这通常是最后一个 GET 请求。

例如,用户将访问“/rootpath2/myform”,填写并提交表单。该表单将发布到“/rootpath2/myform”,并且用户将返回到相同的 URI,并显示一条消息,表明表单提交成功(或者发生错误,如果他们这样做了)。

这里的问题是 GET 总是在 POST 之前,而 POST 总是触发缓存命中并返回该值。

Flask-Cache 有没有办法区分 GET 和 POST 并根据它们进行处理(仅缓存 GET)?

4

1 回答 1

0

是的。cache装饰器提供了一个接受可调用对象的unlesskwarg。从可调用对象返回True以取消缓存。使用以下方法对其进行测试:

from flask import Flask, request, render_template_string
from flask.ext.cache import Cache

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

t = '<form action="/" method="POST">{{request.form.dob}}<input name="dob" type="date" value={{request.form.dob}} /><button>Go</button></form>'

def only_cache_get(*args, **kwargs):
    if request.method == 'GET':
        return False

    return True


@app.route('/', methods=['GET', 'POST'])
@cache.cached(timeout=100, unless=only_cache_get)
def home():
    if request.method == 'GET':
        print('GET is not cached')
        return render_template_string(t)

    if request.method == 'POST':
        print('POST is not cached')
        return render_template_string(t)

app.run(debug=True)
于 2016-01-29T02:09:49.550 回答