Инициализация cherrypy.session рано

Мне нравится API CherryPy для сеансов, за исключением одной детали. Вместо того, чтобы говорить 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()

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

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

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

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

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

1 ответ

Для CherryPy 3.1 вам нужно будет найти правильный подкласс Session, запустить его метод 'setup' classmethod, а затем установить 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.

licensed under cc by-sa 3.0 with attribution.