Иметь дело с сессиями 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)