Flask / Jinja memoization

时间:2015-09-09 01:20:28

标签: flask jinja2 flask-cache

我一直在尝试使用Flask-Cache的memoize功能只返回statusTS()的缓存结果,除非在另一个请求中删除某个条件,然后删除缓存。

虽然它没有被删除,并且Jinja模板仍然显示在线,因为服务器已经停止,因此它应该显示为脱机。所以当它不应该返回缓存结果时。

@cache.memoize(60)
def statusTS(sid):
    try:
        server = Server.get_info(sid)
        m = Masters.get_info(server.mid)
        if not m.maintenance:
            tsconn = ts3conn(server.mid)
            tsconn.use(str(server.msid))
            command = tsconn.send_command('serverinfo')
            tsconn.disconnect()
            if not command.data[0]['virtualserver_status'] == 'template':
                return 'Online'

            return 'Unknown'
    except:
        return 'Unknown'

app.jinja_env.globals.update(statusTS=statusTS)

Jinja模板:

                              {% if statusTS(server.sid) == 'Online' %}
                        <span class="label label-success">
                          Online
                        </span>{% endif %}

这会呈现视图:

@app.route('/manage/')
def manage():
    if g.user:
        rl = requests_list(g.user.id)
        admin = User.is_admin(g.user.id)
        g.servers = get_servers_by_uid(g.user.id)
        if 's' in request.args:
            s = request.args.get('s')
            s = literal_eval(s)
        else:
            s = None
        return render_template('manage.html',
                               user=g.user,
                               servers=g.servers,
                               admin=admin,
                               globallimit=Config.get_opts('globallimit'),
                               news=News.get_latest(),
                               form=Form(),
                               masters=Masters.get_all(),
                               treply=rl,
                               s=s)
    else:
        return redirect(url_for('login'))

这是应该删除条目的内容。

@app.route('/stop/<id>/')
@limiter.limit("3/minute")
def stop(id):
    if g.user:
        if Server.is_owner(g.user.id, id):
            m = Masters.get_info(Server.get_info(id).mid)
            if not m.maintenance:
                cache.delete_memoized(statusTS, id)
                flash(stopTS(id))
                return redirect(url_for('manage'))
            else:
                flash(
                    'You cannot stop this server while the master is locked for maintenance - please check for further info.')
                return redirect(url_for('manage'))
        else:
            flash(
                'You do not have permission to modify this server - please contact support.')
            return redirect(url_for('manage'))
    else:
        return redirect(url_for('login'))

1 个答案:

答案 0 :(得分:0)

您的代码看起来是正确的。它可能是您正在使用的任何后端缓存中的错误。

有效的玩具示例:

from flask import Flask
# noinspection PyUnresolvedReferences
from flask.ext.cache import Cache

app = Flask(__name__)
# Check Configuring Flask-Cache section for more details
cache = Cache(app, config={'CACHE_TYPE': 'simple'})


@cache.memoize(timeout=10)
def statusTS(sid):
    print('Cache Miss: {}.'.format(sid))
    return sid


@app.route('/<int:status_id>')
def status(status_id):
    return 'Status: ' + str(statusTS(status_id))


@app.route('/delete/<int:status_id>')
def delete(status_id):
    print('Deleting Cache')
    cache.delete_memoized(statusTS, status_id)
    return 'Cache Deleted'

if __name__ == '__main__':
    app.debug = True
    app.run()

我认为发生的事情是删除失败。我会踏入 cache.delete_memoized(statusTS, status_id)并查看它是否实际查找并删除了缓存的函数结果。检查werkzeug.contrib.cache.SimpleCache 如果您使用缓存类型简单。