4

Pythonを使用してGoogleアプリエンジンプロジェクトにwebapp2セッションを実装する方法を見つけました。コードは以下です。私が知りたいのは、それを行うための最良のアプローチは何ですか? 私が行ったことは、pythonファイルを作成し、それにBaseHandlerコードをドロップしてから、それをインポートするだけですが、各pythonアプリ/ファイルで構成キーを常に複製する必要があります。

Web サイトから取得した 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)

これが最善の方法ですか、それともより良いアプローチがありますか? ありがとう

4

1 に答える 1

2

セッションを処理する方法は、webapp2.RequestHandler から派生した BaseHandler クラスを作成することでした。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']

詳細については、私の記事を参照してください。

于 2013-12-06T06:34:00.430 に答える