Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top