Инициализация cherrypy.session рано - PullRequest
3 голосов
/ 03 октября 2008

Мне нравится 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()

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

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

1 Ответ

5 голосов
/ 04 октября 2008

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

...