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()