Ранняя инициализация 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()
Это похоже на большой клудж, но я действительно ненавижу писать 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
Поэтому я определенно предпочел бы простой способ инициализировать объект самостоятельно.Кто-нибудь знает как это сделать?
Решение
Для 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.*.