Flask Ошибка: объект «NoneType» не имеет атрибута «постоянный» - PullRequest
2 голосов
/ 08 мая 2020

Я настроил сеанс в моем 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 custum 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, я получаю следующую ошибку.

Отслеживание (последний вызов последним): файл "/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask/app.py", строка 2446, в wsgi_app ctx.pu sh () Файл "/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 = 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 (последний вызов последним): File "/home/thathsara/Documents/PythonProject/venv/lib/python3.5/site-packages/flask/app.py", строка 2446, в wsgi_app ctx.pu sh () Файл "/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)) TypeError: требуется объект, подобный байтам, а не ' str '

Во время обработки указанного выше исключения произошло другое исключение:

Traceback (последний вызов последним): File "/ home / thaths ara / Documents / PythonProject / venv / lib / python3 .5 / site-packages / flask / app.py ", строка 1970, в finalize_request response = self.process_response (response) File" / 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) File" / 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) File" / home / thathsara /Documents/PythonProject/venv/lib/python3.5/site-packages/flask/sessions.py ", строка 268, в get_expiration_time, если session.permanent: AttributeError: объект 'NoneType' не имеет атрибута 'постоянный'

В первый раз без сеанса приложение работает правильно, и как только я установлю сеанс, он будет создан в БД, а идентификатор сеанса будет отправлен в браузер без каких-либо проблем (повар ie ). Но после этого я получаю ошибку выше, даже если вызываю другой маршрут (даже /). Может кто-нибудь объяснить, в чем проблема с моим кодом?

1 Ответ

0 голосов
/ 10 мая 2020

Я обнаружил проблему во время моих более поздних исследований. Основная библиотека 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))
...