flask前端会话是服务器端会话的副本



我有一个小的flask应用程序,最近开始表现奇怪:flash消息不会消失(移动到不同的路由)。它们会在每一页上再次出现。

我了解了显示消息的辅助函数:get_flash_messages应该将消息弹出会话。我用日志测试了它的功能,发现它工作正常:'_flash'消息在它被调用之前在会话上,而在它被调用之后不在会话对象上。

然而,当我转到一个新的路由时,它们重新出现在会话对象上,并再次显示在页面上。

因此,我已经确定jinja2模板可以访问的会话对象是真实对象的副本,因为它实际上不会改变我在app.py文件中可以访问的会话对象(我可以正确地改变)。

以前有人遇到过这个问题吗?我更新了我的烧瓶和所有与烧瓶相关的软件包,但无济于事。

这是我的requirements.py文件的一部分(所有可能有影响的包)。

flask==1.1.2
flask_wtf==0.14.3
flask_cors==3.0.10
jinja2==2.10.3
waitress==1.4.4
Flask-Mobility
secrets==1.0.2
werkzeug==0.16.0
wtforms==2.3.3

这是我的app.py文件的开头

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import secrets
import requests
from functools import wraps
from bokeh.embed import server_document, server_session
from bokeh.client.session import pull_session
from bokeh.util.session_id import generate_session_id
from flask import Flask, url_for, render_template, redirect, jsonify, send_from_directory, session, request, flash, Markup
from flask_cors import CORS
from flask_mobility import Mobility
from waitress import serve
app = Flask(__name__)
CORS(app)    
Mobility(app)
app.config['SECRET_KEY'] = secrets.token_urlsafe(16)

非常典型的设置。我认为这可能是前端缓存或其他东西的问题,所以我尝试了隐身,但它仍然有同样的问题…

当然,前端也没有什么特别的:

<article class="flashes">
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li class="card" onclick=delete_this(this)>
<a title="remove"><p style="margin: 15px; color: #868A8E; cursor: pointer;">
{{message}}
<i class="small material-icons right">close</i>
</p></a>
</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</article>

好了,我明白了。我在会话中保存了一个标记对象,而不是一个常规字符串。当我把它完全取下来时,它开始工作了。我真的不知道是物体太大还是物体的性质导致了这个问题。不管怎样,就是这样。

最新更新