11

まず第一に、私はGAEを初めて使用するため、これを間違った方法で行っている可能性があります。ただし、以前はPHPを使用しており、セッションは永続データを保持する方法でした。私はPython2.7を使用しています。これは、他のすべてのPython開発に使用しているためです。ただし、理想的なソリューションではないにしても、2.5へのダウングレードが有効なソリューションであるかどうか疑問に思い始めています。

シナリオは、概念実証サイトを構築している場合で、 「user」というセッション変数に「admin」の値を設定するだけの「dummy」ログインボタンが必要です。次に、ナビゲーションテンプレートをチェックインして、変数が設定されているかどうかを確認します。設定されている場合は、メニューコマンドをいくつか追加します。とてもシンプルです。 (注:これは安全ではなく、賢明ではないこと、または実行する必要があることは何もわかっていません-問題は、セッションが機能していないことであり、私が実行していることではありません-コードで他のいくつかのことを使用していますセッション-デプロイ時に機能していません)

Pythonを使用したGAEにはいくつかの異なるセッションライブラリがあるようで、Google検索で最も広く推奨されているもの(gaeutilities )を試しましたが、これによりエラーが発生し、機能しませんでした(最終的にこの投稿に出くわして、 Python 2.7とは互換性がありません)。もう少し検索すると、appenginelearn.comからこのライブラリにアクセスしました。このライブラリは、完全に機能しました...デプロイするまでは、何も実行されません。なぜこれが失敗するのかについて、いくつかの指針やアドバイスが欲しいです。これが私が使用している関連コードです:

appenginelearn.comのutilライブラリディレクトリをアプリケーションディレクトリのルートに配置し、セッションをインポートしました。

from util.sessions import Session

次に、LoginクラスとLogoutクラスを追加しました。

class LogIn(webapp2.RequestHandler):
    def get(self):
        self.session = Session()
        self.session['user'] = 'admin'
        # Return the user to the page they logged in from
        referer = self.request.environ['HTTP_REFERER'] \
                if 'HTTP_REFERER' in self.request.environ \
                else '/'
        self.redirect(referer)

class LogOut(webapp2.RequestHandler):
    def get(self):
        self.session = Session()
        self.session.delete_item('user')
        self.redirect('/')

そして、メインクラスの次の(ひどい)コード(これはデモのすべてのページに対して行われます)

class MainPage(webapp2.RequestHandler):
    def get(self):
        self.session = Session()
        logging.info('Main page fired up')
        if 'user' in self.session:
            user = self.session['user']
        else:
            user = None

        template_values = {
            'user': user
            }
        template = jinja_environment.get_template('main.html')
        self.response.out.write(template.render(template_values))

そして、これはHTMLテンプレートファイルにあります

  {% if user %}
      <p>Welcome, {{user}}</p>
  {% endif %}

そして、ログのエラー:

2012-10-04 02:51:28.084 /login 302 143ms 0kb Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4
*ip address removed* - - [04/Oct/2012:02:51:28 -0700] "GET /login HTTP/1.1" 302 136 "*site-removed*" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4" "*site-removed*" ms=144 cpu_ms=0 cpm_usd=0.000015 instance=*instance removed*
**I** 2012-10-04 02:51:28.080
Creating session session-*session number removed*
**E** 2012-10-04 02:51:28.084
Set-Cookie: appengine-simple-session-sid=*session number removed*; Path=/
4

1 に答える 1

20

webapp2セッションを見たことがありますか?すべてが組み込まれており、すぐに始めることができます。

https://webapp2.readthedocs.io/en/latest/api/webapp2_extras/sessions.html

このモジュールは、webapp2の軽量で柔軟なセッションサポートを提供します。セキュアCookie、memcache、データストアの3つの組み込みバックエンドがあります。CustomBackendSessionFactoryを拡張して新しいバックエンドを追加できます。セッションストアは、メソッドSessionStore.get_session()を介して、同じリクエストで異なるバックエンドを使用している場合でも、異なるキーを使用して複数のセッションを提供できます。デフォルトでは、構成のデフォルトキーを使用してセッションを返します。

import webapp2

from webapp2_extras import sessions

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

# To set a value:
self.session['foo'] = 'bar'

# To get a value:
foo = self.session.get('foo')

そうすれば、これを中心にログインシステムを構築するのは本当に簡単です。すでにそれを行っているようです。また、必要に応じて、webapp2セッションでデータストアやmemcacheを使用できるようになります。

于 2012-10-04T22:40:45.987 に答える