gpt4 book ai didi

Flask/Jinja 内存

转载 作者:行者123 更新时间:2023-12-02 07:18:27 27 4
gpt4 key购买 nike

我一直在尝试使用 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 %}

这将呈现 View :

@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'))

最佳答案

您的代码看起来正确。无论您使用哪个后端缓存,这都可能是一个错误。

有效的玩具示例:

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如果您使用的是简单缓存类型。

关于Flask/Jinja 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32469515/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com