2

我在我的 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] 应用程序中的错误:请求终结失败,并在处理错误回溯(最后一次调用):文件“/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 行,在 push 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) File "/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages /flask_mongo_sessions/ init .py",第 18 行,在init initial = pickle.loads(str(initial)) 类型错误:需要一个类似字节的对象,而不是 'str'

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

回溯(最后一次调用):文件“/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 如果 session.permanent: AttributeError: 'NoneType'对象没有“永久”属性

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

4

1 回答 1

0

我在后来的调查中发现了这个问题。主 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))
于 2020-05-10T10:40:56.357 回答