You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Replit中Flask会话在Edge/Chrome重定向后丢失问题求助

Flask重定向后Session在Chrome/Edge中丢失(Firefox正常)

在Replit中运行Flask应用时,调用redirect()后Session会在Microsoft Edge或Chrome浏览器中被重置,但Firefox可正常保留Session。已确认浏览器Cookie功能开启,相关代码及控制台输出如下:

应用代码

from flask import Flask, render_template, request, redirect, url_for, session
import secrets

app = Flask(__name__)
app.secret_key = secrets.token_hex(16)

users = {
    'user1': {'username': 'user1', 'password': 'password1'},
    'user2': {'username': 'user2', 'password': 'password2'}
}

@app.route('/')
def home():
    print("loading home", session)
    return render_template('index.html')

@app.route('/signup', methods=['GET', 'POST'])
def signup():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        users[username] = {'username': username, 'password': password}
        return redirect(url_for('home'))
    return render_template('signup.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    print("loading login", session)
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        user = users.get(username)
        if user and user['password'] == password:
            session['username'] = username
            print("session set", session)
            return redirect(url_for('home'))
    return render_template('login.html')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

控制台输出

172.31.196.1 - - [21/Dec/2023 23:03:48] "OPTIONS * HTTP/1.1" 404 -
loading home <SecureCookieSession {}>
172.31.196.1 - - [21/Dec/2023 23:03:48] "GET / HTTP/1.1" 200 -
loading login <SecureCookieSession {}>
172.31.196.1 - - [21/Dec/2023 23:03:51] "GET /login HTTP/1.1" 200 -
loading login <SecureCookieSession {}>
172.31.196.1 - - [21/Dec/2023 23:03:51] "GET /login HTTP/1.1" 200 -
loading login <SecureCookieSession {}>
session set <SecureCookieSession {'username': 'user1'}>
172.31.196.1 - - [21/Dec/2023 23:04:06] "POST /login HTTP/1.1" 302 -
loading home <SecureCookieSession {}>
172.31.196.1 - - [21/Dec/2023 23:04:06] "GET / HTTP/1.1" 200 -
loading home <SecureCookieSession {}>
172.31.196.1 - - [21/Dec/2023 23:04:06] "GET / HTTP/1.1" 200 -

问题原因

核心差异在于Chrome和Edge对Cookie的SameSite属性默认规则更严格。Replit的运行环境通过反向代理对外提供服务,默认情况下Flask生成的Session Cookie的SameSite属性无法适配这种代理场景,导致浏览器拒绝在重定向请求中携带Cookie,最终Session被重置。

解决方案

方案1:显式配置Session Cookie的SameSite属性

在初始化Flask应用后添加如下配置,根据Replit的HTTPS环境选择合适的设置:

# 基础兼容设置,适用于多数场景
app.config['SESSION_COOKIE_SAMESITE'] = 'Lax'

# 如果Lax模式仍不生效,可尝试None(需配合secure属性,Replit预览链接是HTTPS,支持该设置)
# app.config['SESSION_COOKIE_SAMESITE'] = 'None'
# app.config['SESSION_COOKIE_SECURE'] = True

注:设置SameSite=None时必须开启SESSION_COOKIE_SECURE,否则Chrome/Edge会直接拒绝保存Cookie。

方案2:临时禁用HttpOnly属性(仅测试用,不推荐)

app.config['SESSION_COOKIE_HTTPONLY'] = False

该方案仅用于临时排查问题,长期使用会降低应用安全性,因为HttpOnly是防范XSS攻击的关键属性。

修改配置后重新运行应用,在Chrome/Edge中登录并重定向,查看控制台输出即可验证Session是否正常保留。

内容的提问来源于stack exchange,提问作者John Riehl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:30:36