Flask-Cache没有区分GET和POST

时间:2016-01-28 19:29:51

标签: python flask flask-cache

我的Flask路线结构如下:

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

发布到&#39; / rootpath2 /&#39;对于给定页面,通常从缓存中检索(当存在缓存值时),这通常是最后一个GET请求。

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

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

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

1 个答案:

答案 0 :(得分:0)

是。 cache装饰器提供了一个接受可调用的unless kwarg。从callable返回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)