烧瓶错误:“NoneType”对象没有“永久”属性

Posted

技术标签:

【中文标题】烧瓶错误:“NoneType”对象没有“永久”属性【英文标题】:Flask Error : 'NoneType' object has no attribute 'permanent' 【发布时间】:2020-08-23 23:33:24 【问题描述】:

我在我的 app.py 中配置了会话,如下所示。

#Import framework classes
from flask import Flask, request, session
import json
from datetime import timedelta
from flask_pymongo import PyMongo
from flask_mongo_sessions import MongoDBSessionInterface

#Import custom classes
import sys
sys.path.insert(1, './models')
from StudentModel import*

#App initiate, set app configurations and session configurations
app = Flask(__name__, static_url_path='')
app.config["MONGO_URI"] = "mongodb://localhost:27017/ChatBot"
app.config['SESSION_PERMANENT'] = False
mongo = PyMongo(app)
with app.app_context():
    app.session_interface = MongoDBSessionInterface(app, mongo.db, 'sessions')

#Initialize Helper Classes
StudentModelContract = StudentModel(mongo)

@app.route('/getSession')
def getMessage():
    return session['key']

@app.route('/setSession')
def setMessage():
    return session['key'] = 'value'

现在当我调用 getSession 方法时,出现以下错误。

Traceback(最近一次调用最后一次):文件 “/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask/app.py”, 第 2446 行,在 wsgi_app 中 ctx.push() 文件“/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask/ctx.py”, 第 390 行,正在推送中 self.session = session_interface.open_session(self.app, self.request) 文件 "/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask_mongo_sessions/init.py", 第 57 行,在 open_session 中 session = self.session_class(initial=doc['d'], sid=sid) 文件 "/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask_mongo_sessions/init强>.py", 第 18 行,在 init 中 initial = pickle.loads(str(initial)) TypeError:需要一个类似字节的对象,而不是'str' [2020-05-08 17:27:36,960] 应用程序中的错误: 处理错误时请求终结失败并出现错误 Traceback(最近一次通话最后一次):文件 “/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask/app.py”, 第 2446 行,在 wsgi_app 中 ctx.push() 文件“/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask/ctx.py”, 第 390 行,正在推送中 self.session = session_interface.open_session(self.app, self.request) 文件 "/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask_mongo_sessions/init.py", 第 57 行,在 open_session 中 session = self.session_class(initial=doc['d'], sid=sid) 文件 "/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask_mongo_sessions/init强>.py", 第 18 行,在 init 中 initial = pickle.loads(str(initial)) TypeError: a bytes-like object is required, not 'str'

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件 “/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask/app.py”, 第 1970 行,在 finalize_request 中 response = self.process_response(response) 文件“/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask/app.py”, 第 2269 行,在 process_response self.session_interface.save_session(self, ctx.session, response) 文件 "/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask_mongo_sessions/init.py", 第 68 行,在 save_session 中 cookie_exp = self.get_expiration_time(app, session) 文件“/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask/sessions.py”, 第 268 行,在 get_expiration_time if session.permanent: AttributeError: 'NoneType' object has no attribute 'permanent'

第一次没有任何会话时应用程序正常运行,一旦我设置了会话,它将在数据库中创建,并且会话 ID 会毫无问题地发送到浏览器(cookie)。但在那之后,即使我调用另一条路线(甚至/),我也得到了错误。 有人可以解释我的代码有什么问题吗?

【问题讨论】:

我尝试运行您提供的代码。您没有收到return session['key'] = 'value' 行的错误吗? 【参考方案1】:

我在后来的调查中发现了这个问题。主 flask_mongo_session 库在打开会话时使用以下类。

class MongoDBSession(CallbackDict, SessionMixin):
def __init__(self, initial=None, sid=None, new=True):
    def on_update(this):
        this.modified = True
    if initial:
        initial = pickle.loads(str(initial))
    CallbackDict.__init__(self, initial, on_update)
    self.sid = sid
    self.new = new
    self.modified = False

def pack(self):
    return Binary(pickle.dumps(dict(self)))

下面这行有问题。

initial = pickle.loads(str(initial))

改成,

initial = pickle.loads((initial))

【讨论】:

以上是关于烧瓶错误:“NoneType”对象没有“永久”属性的主要内容,如果未能解决你的问题,请参考以下文章

Discord Bot - “属性错误:'NoneType' 对象没有属性'strip。'

属性错误:“NoneType”对象没有属性“父”

Elastic Beanstalk 部署错误:AttributeError :: 'NoneType' 对象没有属性 'split'

分析 GPX 数据时出现错误“'NoneType' 对象没有属性 'offset'”

使用 sender() 获取按钮文本总是返回错误 — 'NoneType' 对象没有属性 'text'

属性错误:nonetype 对象没有形状