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

Azure Web Service中Flask-Session会话Cookie过期问题求助

Flask-Session会话Cookie在Azure Web Service中无法正常设置的解决方案

本地运行Flask-Session(filesystem存储类型)时会话Cookie正常,但部署到Azure Web Service后,会话Cookie值为空且过期时间显示为1970-01-01T00:00:00.000Z,无相关错误日志,可通过以下步骤解决:

1. 显式配置Flask签名密钥

Flask需要稳定的密钥签名会话Cookie,本地环境会自动生成临时密钥,但Azure的多实例或重启场景会导致密钥丢失,直接引发会话失效。添加配置:

import os
# 生产环境建议通过Azure应用程序设置添加环境变量SECRET_KEY,避免硬编码
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY', 'temp-fallback-key')

2. 指定可读写的会话存储目录

Azure Web Service默认文件系统部分目录权限受限,Flask-Session的filesystem类型需要有读写权限的目录,建议使用Azure提供的临时目录:

import os
# 使用Azure官方临时目录,或 fallback 到/tmp
session_dir = os.path.join(os.getenv('WEBAPP_TEMP_PATH', '/tmp'), 'flask_session')
# 确保目录存在,避免启动报错
os.makedirs(session_dir, exist_ok=True)
app.config['SESSION_FILE_DIR'] = session_dir

WEBAPP_TEMP_PATH是Azure Web App内置的环境变量,指向可读写的临时存储目录,实例重启时目录会被清空,但不影响会话的临时存储特性。

3. 配置反向代理信任

Azure Web Service的请求通过反向代理转发,Flask需要识别真实的请求协议(HTTPS),否则SESSION_COOKIE_SECURE会失效。添加代理修复中间件:

from werkzeug.middleware.proxy_fix import ProxyFix

# 信任代理传递的x-forwarded系列头,识别真实请求协议
app.wsgi_app = ProxyFix(
    app.wsgi_app, x_for=1, x_proto=1, x_host=1
)
# 强制Flask使用HTTPS生成URL
app.config['PREFERRED_URL_SCHEME'] = 'https'

保持原有Cookie安全配置:

app.config['SESSION_COOKIE_SAMESITE'] = 'None'
app.config['SESSION_COOKIE_SECURE'] = True

4. 验证会话功能

添加测试路由确认会话是否正常工作:

@app.route('/test_session')
def test_session():
    session['test_key'] = 'test_value'
    return f"会话值: {session.get('test_key')}, 会话目录存在: {os.path.exists(app.config['SESSION_FILE_DIR'])}"

访问该路由,返回会话值: test_value则说明会话存储正常。

完整配置示例

from flask import Flask, session
from flask_session import Session
from datetime import timedelta
import os
from werkzeug.middleware.proxy_fix import ProxyFix

app = Flask(__name__)

# 基础配置
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY', 'temp-fallback-key')
app.config['SESSION_TYPE'] = 'filesystem'
app.config['SESSION_COOKIE_SAMESITE'] = 'None'
app.config['SESSION_COOKIE_SECURE'] = True
app.config['SESSION_COOKIE_DURATION'] = timedelta(days=1)
app.config['PREFERRED_URL_SCHEME'] = 'https'

# 配置会话存储目录
session_dir = os.path.join(os.getenv('WEBAPP_TEMP_PATH', '/tmp'), 'flask_session')
os.makedirs(session_dir, exist_ok=True)
app.config['SESSION_FILE_DIR'] = session_dir

# 信任反向代理
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1)

Session(app)

@app.route('/')
def index():
    session['count'] = session.get('count', 0) + 1
    return f"访问次数: {session['count']}"

if __name__ == '__main__':
    app.run()

内容的提问来源于stack exchange,提问作者Bobby Baker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:15:05