slav0nic's blog

Заметки о python, linux и других занимательных вещах

Пример использование сессий в web.py

На текущий момент использование сессий является проблемой, потому что их по сути нет=) Хотя в wep.py 0.3 будет добавлен простенький модуль для работы с сессиями. Авторы web.py советуют использовать flup для работы с сессиями, но меняю смущает пару вещей: 1) автор сам советует использовать другие средства (в его блоге проскакивало В) ) 2) смущает надпись "Some WSGI middleware which may or may not be useful to other projects" + "Removed in 1.0" =) Поэтому не стал далеко ходить, выбрал Beaker - middleware для работы с сессиями, который по дефолту используется в pylons. Beaker позволяет хранить сессии в dbm файле либо в памяти + в куках. Недостаток лишь 1 - документация гуано, точнее её на офсайте вообще нет, только простой пример. Более внятные детали можно глянуть здесь и здесь. Подключение в web.py происходит как и во всех WSGI приложениях: 1) SessionMiddleware (как и все другие "прослойки") передаётся ф-цие web.run() 3-м параметром. 2) сессия импортируется из web.ctx.environ['beaker.session'] (ctx - переменная, которая содержит в себе информацию о запросе: ip адрес клиента, тип браузера и тп информацию) После чего можно использовать сессии. Простой пример счётчика запросов:
  1. from beaker.session import SessionMiddleware
  2. import web
  3. web.webapi.internalerror = web.debugerror
  4.  
  5. def session_mw(app):
  6.    return SessionMiddleware(app)
  7.    
  8. urls = (
  9.     '/', 'index',
  10. )
  11. class index:
  12.     def GET(self):
  13.         session = web.ctx.environ['beaker.session']
  14.         if not session.has_key('value'):
  15.                 session['value'] = 0
  16.         session['value'] += 1
  17.         print (session['value'], session.is_new, session.type)
  18.         session.save()
  19.  
  20. if __name__ == '__main__':
  21.    web.run(urls, globals(),*(web.reloader, session_mw))Syhi-подсветка кода

web.py