2

基本的に私が達成しようとしているのは、ユーザーがログインしているかどうかを確認することです。ログインしていない場合は、/somepage にリダイレクトされます。webapp.RequestHandler を拡張するクラスを作成し、後でそのクラスを拡張するコードで作成しようとしています。(cakephp の beforeFilter のようなもの) 不明な点がある場合は、説明します :)。

4

5 に答える 5

2

dispatch()webapp リクエストのメソッドをオーバーライドして、このチェックをsuper()呼び出しの前に置くことができます。

http://webapp-improved.appspot.com/guide/handlers.html#overriding-dispatch

他の回答で示唆されているように、デコレーターを使用することもできますが、それには各ハンドラーの先頭に配置する必要があります (必要な場合とそうでない場合があります)。dispatch()上記のようにオーバーライドすると、すべてのページに対して 1 回で済みます。

python2.5 ランタイムを使用している場合は、プロジェクトに webapp2 をインストールし、コードで使用する必要があります。

于 2012-04-12T18:02:02.960 に答える
1

私が行ったことは、次のようなテンプレート メソッド デザイン パターンを使用できるクラス階層を作成することです。

 class Page(webapp.RequestHandler):

     def do_get(self):
         ''' override in derived classes to actually do something '''
         pass

     def get(self):
         ''' do NOT override this in derived classes '''
         # do whatever you need to do to verify that the get() should succeed. 
         # Maybe redirect, show an error, whatever
         self.do_get()

...テンプレート メソッド関数の呼び出しを取り巻くロジックは、do_get()必要に応じて複雑にすることができます。ハンドラー クラスがすべてこのクラスから派生している限り、それらは自動的に正しい動作を取得します。

于 2012-04-12T18:30:30.853 に答える
1

私はこれをテストしていませんが、これはうまくいくはずです。webapp2 の代わりに BasicHandler を直接使用する限り、ユーザーがログインしていないリクエストはすべてリダイレクトされます。

class BasicHandler(webapp2.RequestHandler):
   def __init__(self, request=None, response=None):
      self.initialize(request, response)
      self.user = users.get_current_user()
      if not self.user:
         self.redirect('/somepage')

class Page(BasicHandler):
   def get(self):
      # Do your work/render...

*編集 BasicHandler を独自の .py ファイルに入れ、それをインポートします

于 2012-04-12T19:26:29.887 に答える
1

1 つの方法は、Django でユーザー認証に使用されるものと同様の Python デコレーターを実装することです。たとえばlogin_requiredデコレータ。このstackoverflowのスレッドも関連しています。

于 2012-04-12T18:00:07.620 に答える
1

デコレータを使用します。

ドキュメントはこちら: http://www.python.org/dev/peps/pep-0318/

リクエスト パスのスラッシュを削除する例を次に示します。

def removeslash(method):
    """Use this decorator to remove trailing slashes from the request path.

    For example, a request to '/foo/' would redirect to '/foo' with this
    decorator. Your request handler mapping should use a regular expression
    like r'/foo/*' in conjunction with using the decorator.
    """
    @functools.wraps(method)
    def wrapper(self, *args, **kwargs):
        if self.request.path.endswith("/"):
            if self.request.method == "GET":
                uri = self.request.path.rstrip("/")
                if self.request.query: uri += "?" + self.request.query
                self.redirect(uri)
                return
            return self.status(404)
        return method(self, *args, **kwargs)
    return wrapper

そして、あなたはそれを次のように使用します:

class MyHandler(RequestHandler):
    @removeslash
    def get(self):
        # your code
于 2012-04-12T18:04:05.207 に答える