Flask 烧瓶/金贾回忆录

Flask 烧瓶/金贾回忆录,flask,jinja2,flask-cache,Flask,Jinja2,Flask Cache,我一直试图使用和Flask Cache的memoize功能仅返回statusTS()的缓存结果,除非在另一个请求中满足某个条件,然后删除缓存 但它并没有被删除,而且Jinja模板仍然在线显示,而实际上它应该离线显示,因为服务器已经停止。因此,当它不应该返回缓存结果时,它返回一个缓存结果 @cache.memoize(60) def statusTS(sid): try: server = Server.get_info(sid) m = Masters.g

我一直试图使用和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('/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'))
@app.route('/stop/'))
@限制器限值(“3/分钟”)
def停止(id):
如果g.用户:
如果Server.is_所有者(g.user.id,id):
m=Masters.get_info(Server.get_info(id).mid)
如果不是m.维护:
cache.delete_memorized(状态、id)
闪光(停止(id))
返回重定向(url_for('manage'))
其他:
闪光(
“在主机被锁定进行维护时,您无法停止此服务器-请查看更多信息。”)
返回重定向(url_for('manage'))
其他:
闪光(
“您没有修改此服务器的权限-请与支持部门联系。”)
返回重定向(url_for('manage'))
其他:
返回重定向(url_用于('login'))

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

工作原理的示例:

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()
从烧瓶导入烧瓶
#无检查未溶解参考
从flask.ext.cache导入缓存
app=烧瓶(名称)
#有关更多详细信息,请查看“配置烧瓶缓存”部分
cache=cache(应用程序,配置={'cache\u TYPE':'simple'})
@cache.memoize(超时=10)
def状态(sid):
打印('缓存未命中:{}.'.format(sid))
返回sid
@应用程序路径(“/”)
def状态(状态标识):
返回“状态:”+str(状态(状态id))
@app.route(“/delete/”)
def删除(状态\u id):
打印('删除缓存')
cache.delete\u memorized(状态、状态id)
返回“缓存已删除”
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.debug=True
app.run()
我认为发生的是删除失败了。我会走进房间
cache.delete\u memorized(statusTS,status\u id)
并查看它是否确实找到并删除了缓存的函数结果。检查werkzeug.contrib.cache.SimpleCache
如果您使用的是简单的缓存类型。

cache.cached()不考虑任何参数吗?还有,cache.cached有删除方法吗?我做了更多的测试并更新了我的答案,你的api调用看起来很正确,那么记住类方法然后删除它们怎么样?cache.delete\u memorized(Server.get\u Server,g.user.id)-这会产生异常异常异常是什么?
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()