首页 > 编程问答 >一段时间后登录时 Flask 出现 SESSION_COOKIE_NAME 错误

一段时间后登录时 Flask 出现 SESSION_COOKIE_NAME 错误

时间:2024-07-23 16:06:54浏览次数:14  
标签:python flask web session session-cookies

直到最近,一切都很好,但现在我的网站不断给出“SESSION_COOKIE_NAME”和“NoneType”对象没有属性“修改”错误。但令人感兴趣的是,如果我更改代码,错误如何消失一段时间并不重要。请帮助知识渊博的人

这里是代码最重要的部分:

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)

# I'm also using part of code like this in my app
    session["user_id"] = rows[0]["id"]
    # or
    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'

我只是没有尝试完全删除它并更改名称。登录帐户一段时间后会出现此问题,当尝试搜索站点时,它只是给出此错误而不是 POST 请求。


这个错误信息表明你的 Flask 应用在处理用户会话时遇到了问题,特别是当尝试访问或保存会话数据时。让我们一步一步地分解一下错误信息和可能的原因:

1. 弃用警告

DeprecationWarning: 'session_cookie_name' is deprecated and will be removed in Flask 2.3. Use 'SESSION_COOKIE_NAME' in 'app.config' instead.

这个警告提示你正在使用一个即将弃用的方法来获取会话 cookie 的名称。虽然它现在不会导致错误,但最好修正它以确保未来的兼容性。

解决方法: 将你的代码中所有使用 app.session_cookie_name 的地方替换为 app.config['SESSION_COOKIE_NAME']

2. 属性错误

AttributeError: 'NoneType' object has no attribute 'modified'

这个错误是主要问题。它表明在 flask_session 尝试保存会话时, ctx.session 的值为 None ,这意味着此时没有可用的有效会话。

可能的原因和解决方案:

  • 会话过期或无效: 检查你的 SESSION_PERMANENT PERMANENT_SESSION_LIFETIME 设置。如果会话过期或由于某种原因变得无效(例如,如果用户清除了他们的 cookies), ctx.session 将为 None

    • 解决方案:
      • 确保你的会话配置符合你的需求,特别是关于会话持续时间。
      • 在你的代码中实现适当的错误处理机制,以便在会话不可用时优雅地处理这种情况(例如,将用户重定向到登录页面)。
  • 会话存储问题: 你正在使用基于文件系统的会话存储( app.config["SESSION_TYPE"] = "filesystem" )。如果临时目录不可访问或磁盘空间不足,可能会导致问题。

    • 解决方案:
      • 确保你的 Flask 应用有权写入 SESSION_FILE_DIR 指定的目录。
      • 考虑使用更强大的会话存储机制,例如数据库或内存缓存,特别是对于生产环境。
  • cookie 被阻止: 一些浏览器或浏览器扩展可能会阻止设置 cookie,从而阻止会话的创建或恢复。

    • 解决方案:
      • 建议用户允许你的网站使用 cookie。
      • 考虑使用替代的会话管理机制,如果 cookie 不是一个可行的选择。

调试建议:

  • 启用日志记录: 在你的 Flask 应用中启用详细的日志记录,以获取有关会话处理过程中发生的事件的更多信息。
  • 逐步调试: 使用调试器逐步执行你的代码,特别是在会话创建、访问和修改的点,以确定问题发生的位置。
  • 检查会话数据: 在尝试访问会话数据之前,添加检查以查看会话是否存在且是否包含预期的数据。

通过遵循这些步骤,你应该能够确定你的 Flask 应用中出现“SESSION_COOKIE_NAME”错误和“NoneType”对象没有属性“modified”错误的根本原因并加以解决。

标签:python,flask,web,session,session-cookies
From: 76015992

相关文章

  • Python 上债券的内部收益率
    在Excel中,有一个公式(IRR.Payment:https://support.microsoft.com/fr-fr/office/fonction-tri-paiements-de1242ec-6477-445b-b11b-a303ad9adc9d)计算债券的IRR。我正在尝试在python算法上重现这一点,以便能够在我的代码中计算它。我在网上找到了这段代码:importnumpy......
  • 【待做】【渗透测试系列】Web渗透测试工具 - wscan
    刻刀|采用机器学习技术自动化的Web渗透测试工具-wscan介绍Wscan是一款专注于WEB安全的扫描器,我们的工具采用了机器学习技术实现了全自动化的Web渗透测试。https://github.com/chushuai/wscan2024.7.7新功能[1]支持常规log4j-rce漏洞检测[2]YamlPOC支持ldap_url和r......
  • 使用Python连接ftps服务器时nlst返回错误
    我可以使用TotalCommander登录服务器:ftps://publishedprices.co.il用户名:“奥舍拉德”密码为空并带有lftp-uosherad:publishedprices.co.il但是当我尝试登录并使用Python获取文件列表时nlst函数返回超时代码:fromftplibimportFTP_TLS......
  • 在我的 python 代码中,我无法使用 slixmpp 连接到 Openfire 服务器
    在我的python代码中,我无法连接到Openfire服务器。我想连接到OpenFire服务器我的代码是importthreadingimporttkinterastkfromtkinterimportsimpledialog,scrolledtextimportjsonimportloggingimportasynciofromslixmppimportClientXMPPcla......
  • 如何在Python中获取字符的unicode?
    想要获取中文或越南语的汉名和日文字符的unicode我已经尝试过这些代码text="......
  • 三种语言实现计算逆序对的数量(C++/Python/Java)
    题目给定一个长度为......
  • python项目中__init__.py是什么文件有什么作用
    __init__.py 文件在Python项目中的作用主要是将目录标识为一个Python包。它在包的初始化过程中起到了重要作用。具体来说,__init__.py 文件有以下几个功能:1.标识包:-当一个目录中包含 __init__.py 文件时,这个目录就被视为一个Python包。这样,Python解释器就能够识别......
  • 从零开始构建你的第一个Python Web应用
    在本文中,我们将带领你从零开始构建一个简单的PythonWeb应用。不需要任何先验知识,我们会一步步地指导你完成设置、框架选择、代码编写到部署的整个过程。无论你是Web开发新手还是希望扩展技能的老手,这篇文章都将为你提供一个实践操作的起点。一、前言随着互联网技术的飞速......
  • Python中的global关键字是如何工作的?
    在Python中,global关键字扮演着特殊而重要的角色,它主要用于在函数内部声明全局变量。理解global关键字的工作原理,首先需要明确Python中变量作用域的概念,以及为什么需要global关键字。下面,我将详细解释global关键字的工作机制,包括其作用、使用场景、注意事项,以及它在Python编......
  • Python中enumerate()函数
    Python中enumerate()函数的作用是什么?enumerate()函数在Python中是一个非常有用的内置函数,它用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。使用enumerate()可以使你在循环中获取每个元素的同时,也能......