GAE webapp2 session: правильный процесс создания и проверки сессий
Я попытался выполнить сессию GAAP webapp2, но, похоже, очень мало документации об этом. Согласно http://webapp-improved.appspot.com/api/webapp2_extras/sessions.html, мои действия следующие:
1.Устроить и добавить конфигурацию в основное приложение:
config = {}
config['webapp2_extras.sessions'] = {
'secret_key': 'my_secret_key',
}
app = webapp2.WSGIApplication([...], config=config)
2.Создание сеанса в обработчике входа
# Delete existent session
--> not mention in the tutorial
# member is found
self.session_store = sessions.get_store(request=handler.request)
self.session['account'] = member.account
3. Проверьте, существует ли сеанс в разных местах моей программы
if self.session['account']:
# Session exists
4. Завершить сеанс при выходе пользователя из системы
--> not mentioned in the tutorial
Мои вопросы:
-
У меня появилось сообщение об ошибке "... объект не имеет атрибута" сеанс "во время процесса создания сеанса (шаг 2)
-
Как удалить сеанс в шагах 2 и 4?
-
Правильно ли работает общий процесс управления сеансом?
Спасибо.
Ответы
Ответ 1
Это не может быть прямым ответом на вопрос, но это решение, которое я нашел, используя gaesessions вместо сессии GAAP webapp2, и я хотел бы поделиться со всеми. Здесь мы идем:
-
Загрузите gaesessions из https://github.com/dound/gae-sessions, нажав кнопку "Загрузить ZIP". Загруженный файл "gae-sessions-master.zip".
-
Разархивируйте файл (будет создан каталог "gae-sessions-master" ) и скопируйте каталог "gaessions" в корневой каталог вашего приложения (например, где "app.yaml" )
-
Создайте файл с именем "appengine_config.py" в корневом каталоге со следующим содержимым (скопированная форма https://github.com/dound/gae-sessions/tree/master/demo)
from gaesessions import SessionMiddleware
# Original comments deleted ...
# Create a random string for COOKIE_KDY and the string has to
# be permanent. "os.urandom(64)" function may be used but do
# not use it *dynamically*.
# For me, I just randomly generate a string of length 64
# and paste it here, such as the following:
COOKIE_KEY = 'ppb52adekdhD25dqpbKu39dDKsd.....'
def webapp_add_wsgi_middleware(app):
from google.appengine.ext.appstats import recording
app = SessionMiddleware(app, cookie_key=COOKIE_KEY)
app = recording.appstats_wsgi_middleware(app)
return app
-
Создайте сеанс, когда пользователь входит в систему (переменная - учетная запись пользователя):
from gaesessions import get_current_session
session = get_current_session()
if session.is_active():
session.terminate()
# start a session for the user (old one was terminated)
session['account'] = account
-
Проверьте, существует ли пользовательский сеанс, если да, вернуть учетную запись пользователя:
from gaesessions import get_current_session
def checkSession():
session = get_current_session()
if session.is_active():
return session['account']
return False
-
Удалите сеанс при выходе пользователя из системы:
def logout():
session = get_current_session()
if session.is_active():
session.terminate()
-
Наконец, вы можете создать задание cron для периодического удаления истекших сеансов:
cron.yaml:
- description: daily session cleanup
url: /clean_up_sessions
schedule: every day 3:00
timezone: ... (Your time zone)
Функции:
from gaesessions import delete_expired_sessions
class clean_up_sessions(webapp2.RequestHandler):
def get(self):
while not delete_expired_sessions():
pass
Надеюсь, что это поможет.
Ответ 2
Вот пример обработчика и как использовать дополнительные сеансы webapp2
main.py с BaseHandler и MainHandler
import webapp2
from webapp2_extras import sessions
class BaseHandler(webapp2.RequestHandler): # taken from the webapp2 extrta session example
def dispatch(self): # override dispatch
# Get a session store for this request.
self.session_store = sessions.get_store(request=self.request)
try:
# Dispatch the request.
webapp2.RequestHandler.dispatch(self) # dispatch the main handler
finally:
# Save all sessions.
self.session_store.save_sessions(self.response)
@webapp2.cached_property
def session(self):
# Returns a session using the default cookie key.
return self.session_store.get_session()
class YourMainHandler(BaseHandler):
def get(self):
....
self.session['foo'] = 'bar'
def post(self):
foo = self.session.get('foo')
И если у вас есть отдельный login.py:
.... other imports
import main
class Login(main.BaseHandler):
def get(self):
....
self.session['foo'] = 'bar'
def post(self):
foo = self.session.get('foo')
Ответ 3
В RequestHandler
переопределении dispatch
: из сеансов импорта webapp2_extras
def dispatch(self):
self.session_store = sessions.get_store(request=self.request)
try:
webapp2.RequestHandler.dispatch(self)
finally:
self.session_store.save_sessions(self.response)
и сделайте webapp2.cached_property
, называемый session
:
@webapp2.cached_property
def session(self):
return self.session_store.get_session(backend="<whatever you want here>")
Если вы хотите получить доступ к значениям сеанса, выполните self.session[<key>]
Когда пользователь входит в систему, вы можете позвонить либо:
self.auth.get_user_by_password(auth_id, password, remember=True,
save_session=True)
который позаботится о том, чтобы избавиться от старой сессии и создать новую для вас, или:
self.auth.set_session(self.auth.store.user_to_dict(self.user), remember=True)
Что касается выхода из системы, все, что вам нужно вызвать:
self.auth.unset_session()