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

flask front end session is a copy of server side session

我有一个小烧瓶应用程序最近开始表现得很奇怪:闪现消息不会消失(在移动到不同的路线时)。它们会再次出现在每一页上。

我了解到显示消息的辅助函数:get_flashed_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)

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

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

  <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>

好的,我知道了。我在会话中保存了一个标记对象而不是常规字符串。当我完全删除它时,它开始工作了。真的不知道它是否只是一个太大的对象,或者是否是导致问题的对象的性质。不管怎样,就是这样。