Flask 烧瓶/金贾回忆录
我一直试图使用和Flask Cache的memoize功能仅返回statusTS()的缓存结果,除非在另一个请求中满足某个条件,然后删除缓存 但它并没有被删除,而且Jinja模板仍然在线显示,而实际上它应该离线显示,因为服务器已经停止。因此,当它不应该返回缓存结果时,它返回一个缓存结果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
@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()