Flask登录一段时间后出现SESSION_COOKIE_NAME及NoneType属性异常求助
Flask会话警告及
NoneType错误排查与解决 问题概述
Flask站点此前运行正常,近期频繁触发SESSION_COOKIE_NAME弃用警告,以及'NoneType' object has no attribute 'modified'错误。修改代码后错误会暂时消失,但一段时间后复现,且仅在用户登录一段时间后执行POST请求(如搜索)时触发。
核心代码片段
import os import plotly.express as px import cs50 import pandas as pd import json import plotly import requests from dotenv import load_dotenv from cs50 import SQL from flask import Flask, flash, redirect, render_template, request, session, jsonify, url_for from flask_session import Session from tempfile import mkdtemp from werkzeug.security import check_password_hash, generate_password_hash from datetime import datetime from plotly.graph_objs import Figure, Scatter from helpers import apology, login_required, lookup, usd # Configure application app = Flask(__name__) load_dotenv() # Configure session to use filesystem (instead of signed cookies) app.config["TEMPLATES_AUTO_RELOAD"] = True app.config["SESSION_TYPE"] = "filesystem" app.config["SESSION_FILE_DIR"] = mkdtemp() app.config["SESSION_PERMANENT"] = False app.config["SESSION_USE_SIGNER"] = True app.config["SECRET_KEY"] = os.urandom(24) app.config["SESSION_COOKIE_NAME"] = 'session_cookie_name' Session(app) # 会话使用示例 # session["user_id"] = rows[0]["id"] # user_id = session["user_id"] if __name__ == '__main__': app.run()
错误日志
Traceback (most recent call last): File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 2527, in wsgi_app ctx.push() File "/usr/local/lib/python3.11/site-packages/flask/ctx.py", line 375, in push self.session = session_interface.open_session(self.app, self.request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/flask_session/sessions.py", line 329, in open_session sid = request.cookies.get(app.session_cookie_name) ^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 287, in session_cookie_name warnings.warn( DeprecationWarning: 'session_cookie_name' is deprecated and will be removed in Flask 2.3. Use 'SESSION_COOKIE_NAME' in 'app.config' instead. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 1847, in finalize_request response = self.process_response(response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 2343, in process_response self.session_interface.save_session(self, ctx.session, response) File "/usr/local/lib/python3.11/site-packages/flask_session/sessions.py", line 353, in save_session if session.modified: ^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'modified'
解决方案
1. 修复flask-session版本兼容性
当前使用的flask-session版本未适配Flask 2.3+的配置变更,导致读取app.session_cookie_name属性时触发弃用警告,进而引发会话初始化失败,最终导致save_session时session对象为None。
- 执行升级命令:
pip install --upgrade flask-session
2. 修正会话存储目录配置
使用mkdtemp()创建的临时目录会被系统自动清理,导致会话文件丢失,引发会话读取失败。需改为固定持久目录:
# 替换原SESSION_FILE_DIR配置 app.config["SESSION_FILE_DIR"] = os.path.join(os.path.dirname(__file__), 'sessions') # 确保目录存在,避免启动报错 os.makedirs(app.config["SESSION_FILE_DIR"], exist_ok=True)
3. 规范会话配置项
确保所有会话配置使用大写命名规范,同时避免动态生成SECRET_KEY(每次重启会导致现有会话失效):
app.config.update( SESSION_TYPE="filesystem", SESSION_PERMANENT=False, SESSION_USE_SIGNER=True, # 从环境变量读取固定密钥,而非每次生成 SECRET_KEY=os.getenv("SECRET_KEY", os.urandom(24)), SESSION_COOKIE_NAME='flask_session', TEMPLATES_AUTO_RELOAD=True )
4. 添加会话异常兜底处理
在请求钩子中捕获会话初始化异常,避免请求崩溃:
@app.before_request def handle_session_error(): try: # 触发会话初始化 session.get('user_id') except Exception: # 重置无效会话,引导用户重新登录 session.clear() return redirect(url_for('login'))
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

