Ранняя инициализация cherrypy.session

Мне нравится CherryPy API для сессий, за исключением одной детали. Вместо того, чтобы говорить cherrypy.session["spam"], я хотел бы просто сказать session["spam"].

К сожалению, я не могу просто иметь глобальный from cherrypy import session в одном из моих модулей, потому что объект cherrypy.session не создается до первого запроса страницы. Есть ли способ заставить CherryPy немедленно инициализировать свой объект сеанса вместо запроса первой страницы?

Если ответ отрицательный, у меня есть две уродливые альтернативы:

Во-первых, я могу сделать что-то вроде этого

def import_session():
    global session
    while not hasattr(cherrypy, "session"):
        sleep(0.1)
    session = cherrypy.session

Thread(target=import_session).start()

Это похоже на большой кладж, но я действительно ненавижу писать cherrypy.session["spam"] каждый раз, так что для меня это того стоит.

Мое второе решение - сделать что-то вроде

class SessionKludge:
    def __getitem__(self, name):
        return cherrypy.session[name]
    def __setitem__(self, name, val):
        cherrypy.session[name] = val

session = SessionKludge()

но это кажется еще большим кладжем, и мне нужно будет проделать больше работы, чтобы реализовать другие словарные функции, такие как .get.

Поэтому я определенно предпочел бы простой способ инициализировать объект самостоятельно. Кто-нибудь знает как это сделать?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
2 361
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для CherryPy 3.1 вам нужно будет найти правильный подкласс Session, запустить его метод класса «setup», а затем установить для cherrypy.session значение ThreadLocalProxy. Все это происходит в cherrypy.lib.sessions.init следующими фрагментами:

# Find the storage class and call setup (first time only).
storage_class = storage_type.title() + 'Session'
storage_class = globals()[storage_class]
if not hasattr(cherrypy, "session"):
    if hasattr(storage_class, "setup"):
        storage_class.setup(**kwargs)

# Create cherrypy.session which will proxy to cherrypy.serving.session
if not hasattr(cherrypy, "session"):
    cherrypy.session = cherrypy._ThreadLocalProxy('session')

Уменьшение (замените FileSession нужным подклассом):

FileSession.setup(**kwargs)
cherrypy.session = cherrypy._ThreadLocalProxy('session')

«Kwargs» состоит из «timeout», «clean_freq» и ​​любых специфичных для подкласса записей из tools.sessions. * Config.

Другие вопросы по теме