Мне нравится 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.
Поэтому я определенно предпочел бы простой способ инициализировать объект самостоятельно. Кто-нибудь знает как это сделать?






Для 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.