Сеансы Webpy: AttributeError: объект «ThreadedDict» не имеет атрибута «имя пользователя»

Я делаю веб-приложение на питоне с помощью web.py, я настроил таблицы и могу войти в систему и все такое, но инициализатор для сеансов, похоже, не работает.

В моем коде есть следующее:

store = web.session.DBStore(db, 'sessions')
session = web.session.Session(app, store, initializer={'logged_in': 0, 'username': ''})

render = web.template.render('templates/', base='base', globals={'session': session, 'username': session.username})

Но это вызывает ошибку: AttributeError: объект 'ThreadedDict' не имеет атрибута 'имя пользователя'

Что может быть сделано? В основном я просто следовал приведенному здесь примеру:
http://webpy.org/cookbook/sessions


person Ole    schedule 06.11.2011    source источник


Ответы (3)


У меня была та же проблема, поэтому я использовал свойство _initializer для получения данных сеанса.

Вот пример:

store = web.session.DBStore(db, 'sessions')
session = web.session.Session(app, store, initializer={'logged_in': 0, 'username': ''})

session_data = session._initializer
render = web.template.render('templates/', base='base', globals={'session': session_data, 'username': session_data['username']})

Затем вы можете получить доступ ко всем данным, которые вы объявили в инициализаторе, из сеанса. Если у кого-то есть лучший способ, пожалуйста, дайте мне знать.

PS: знаю, что уже поздно, но лучше поздно, чем никогда...

person Antonis Kalou    schedule 04.02.2013
comment
Это хорошее решение. Получение переменной сеанса следующим образом: session_data['logged_in'] - спасибо, Антонис. - person Boz; 26.09.2014

Сессия загружается только при обработке запроса, вы не можете получить ее атрибуты во время настройки.

person Andrey Kuzmin    schedule 06.11.2011
comment
Итак, я понял, но теперь это работает, только не спрашивайте меня, как, лол, потому что я понятия не имею. Также мне пришлось перезаписать класс сеанса web.py по умолчанию, чтобы сделать сеансы глобальными для всего домена вместо того, чтобы каждый уникальный URL-адрес имел свой собственный файл cookie сеанса, что действительно не имело для меня смысла. - person Ole; 07.11.2011
comment
Для этой цели вам не нужно создавать подкласс Session, просто установите параметры сеанса: web.config.session_parameters.update(cookie_name="tasty_cookie", cookie_domain="mydomain.com") - person Andrey Kuzmin; 08.11.2011
comment
Домен — это одно, путь — это другое, и это был путь, который был установлен, например. // для индекса, /login/ для логина и т. д., что делает сеансовый файл cookie вообще непригодным для использования. Я просто статически установил путь "/", и он внезапно сработал как шарм - person Ole; 08.11.2011

Вы пытаетесь получить переменную сеанса до ее установки.

Я заметил, что session.username работает в некоторых случаях. Но под WSGI это не удается.

Это отлично работает и находится в документах webpy:

session.get('username', False)

Нет :

session.username

Если вы хотите использовать предустановки в инициализаторе, используйте метод в ответе @Antonis-kalou.

session_data = session._initializer
session.get('username', session_data['username'])
person Boz    schedule 27.09.2014
comment
@Antonis-kalou см. дополнительную информацию выше. 3 года спустя - но у меня возникла проблема только сейчас, поэтому я думаю, что она все еще актуальна. - person Boz; 27.09.2014