Иметь дело с сессиями web.py с subapp?

Я прочитал http://webpy.org/cookbook/sessions_with_subapp. Сессия работает нормально, пока у меня есть только одно приложение, но когда я создаю вспомогательное приложение, я сталкиваюсь с ошибкой ~, подробности ниже:

Main.py:

import web
from sub import subapp
web.config.debug = False

urls = ("/sub",subapp,"/", "count",)

app = web.application(urls, globals())

db = web.database(dbn='sqlite', db='./session.db')
store = web.session.DBStore(db, 'sessions')
session = web.session.Session(app, store, initializer={'count': 0})

def session_hook():
    web.ctx.session = session

app.add_processor(web.loadhook(session_hook))

class count:
    def GET(self):
        session.count += 1
        return str(session.count)

if __name__ == "__main__":
    app.run()

Subapp.py:

import web

urls = ("/", "count",)

subapp = web.application(urls, globals())

session = web.ctx.session

class count:
    def GET(self):
        session.count += 1
        return str(session.count)

Ошибки при попытке запустить:

Traceback (most recent call last):
  File "main.py", line 2, in <module>
    from sub import subapp
  File "/tmp/session/sub.py", line 9, in <module>
    session = web.ctx.session
AttributeError: 'ThreadedDict' object has no attribute 'session'

1 ответ

Решение

Вы не можете просто назначить session = web.ctx.session потому что эта строка выполняется только во время инициализации приложения, но ctx атрибуты доступны только во время запроса. Ты можешь from web import ctx а затем использовать ctx.session вместо session во всех подпапках.

Пример subapp.py:

import web
from web import ctx

urls = (
    "/", "count",
)

subapp = web.application(urls, globals())

class count:
    def GET(self):
        ctx.session.count += 1
        return str(ctx.session.count)
Другие вопросы по тегам