Сеансы Webapp2 в движке приложений Google

Я только что понял, как реализовать сеансы webapp2 в моем проекте движка приложений Google с использованием python. Код ниже. Что я хотел бы знать, так это то, как лучше всего это сделать? Что я сделал, так это создал файл python и поместил в него код BaseHandler, затем я просто импортировал его, но мне приходится постоянно дублировать ключ конфигурации в каждом приложении/файле python.

Код для BaseHandler, который я получил с веб-сайта:

class BaseHandler(webapp2.RequestHandler):
    def dispatch(self):
        # Get a session store for this request.
        self.session_store = sessions.get_store(request=self.request)

        try:
            # Dispatch the request.
            webapp2.RequestHandler.dispatch(self)
        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()

Чтобы установить переменные в сеансе, я просто импортирую BaseHandler в приложение и вызываю следующее, как в примерах:

self.session['name'] = name

Получить переменные так же, как в примере:

name = self.session.get('name')

Часть, которую я должен скопировать в каждый файл, следующая:

 config = {}
 config['webapp2_extras.sessions'] = {'secret_key': 'some-secret-key-to-use',}

app = webapp2.WSGIApplication([('/hello.*', MainHandler),
                            ], config=config, debug=True)

Это лучший способ сделать это или есть лучшие подходы? Спасибо


person Tkingovr    schedule 21.12.2012    source источник
comment
Похоже, у вас много приложений. Почему бы не использовать одно приложение и маршрутизацию для совместного использования приложения и хранилища сеансов.   -  person voscausa    schedule 22.12.2012
comment
Я до сих пор 3 хотел разбить приложение на его основной функционал вместо одного большого файла. Является ли стандартом создание всего приложения в одном скрипте Python?   -  person Tkingovr    schedule 22.12.2012
comment
Нет, см. этот пример: webapp-improved.appspot.com/guide/routing. .html#simple-routes, где вы можете поместить обработчики в другой файл скрипта.   -  person voscausa    schedule 22.12.2012
comment
Хорошо, я так и думал, спасибо за ссылку, теперь я точно вижу, что вы имели в виду под маршрутизацией для обмена   -  person Tkingovr    schedule 22.12.2012


Ответы (1)


Для обработки сеансов я создал класс BaseHandler, производный от webapp2.RequestHandler. Я снабдил класс BaseHandler всей инициализацией сеанса и значениями сеанса по умолчанию и повторно использовал этот класс для создания каждого обработчика вместо прямого производного от webapp2.RequestHandler.

Очевидным преимуществом этого является то, что вам не нужно повторять инициализацию сеанса каждый раз, когда вам нужно использовать сеанс в файле.

class BaseHandler(webapp2.RequestHandler):
    def dispatch(self):
        # Get a session store for this request.
        self.session_store = sessions.get_store(request=self.request)
        try:
            # Dispatch the request.
            webapp2.RequestHandler.dispatch(self)
        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.
        sess = self.session_store.get_session()
        #add some default values:
        if not sess.get('theme'):
            sess['theme']='cosmo'#'slate'
        return sess


class MainPage(BaseHandler):
    def get(self):
        template = JINJA_ENVIRONMENT.get_template('stereo.html')
        if self.request.get('theme'):
            theme=self.request.get('theme')
            self.session['theme']=theme
        else:
            theme=self.session['theme']

См. мою статью для более подробной информации.

person Prahlad Yeri    schedule 06.12.2013