基本的に私が達成しようとしているのは、ユーザーがログインしているかどうかを確認することです。ログインしていない場合は、/somepage にリダイレクトされます。webapp.RequestHandler を拡張するクラスを作成し、後でそのクラスを拡張するコードで作成しようとしています。(cakephp の beforeFilter のようなもの) 不明な点がある場合は、説明します :)。
5 に答える
dispatch()
webapp リクエストのメソッドをオーバーライドして、このチェックをsuper()
呼び出しの前に置くことができます。
http://webapp-improved.appspot.com/guide/handlers.html#overriding-dispatch
他の回答で示唆されているように、デコレーターを使用することもできますが、それには各ハンドラーの先頭に配置する必要があります (必要な場合とそうでない場合があります)。dispatch()
上記のようにオーバーライドすると、すべてのページに対して 1 回で済みます。
python2.5 ランタイムを使用している場合は、プロジェクトに webapp2 をインストールし、コードで使用する必要があります。
私が行ったことは、次のようなテンプレート メソッド デザイン パターンを使用できるクラス階層を作成することです。
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()
必要に応じて複雑にすることができます。ハンドラー クラスがすべてこのクラスから派生している限り、それらは自動的に正しい動作を取得します。
私はこれをテストしていませんが、これはうまくいくはずです。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 ファイルに入れ、それをインポートします
1 つの方法は、Django でユーザー認証に使用されるものと同様の Python デコレーターを実装することです。たとえばlogin_requiredデコレータ。このstackoverflowのスレッドも関連しています。
デコレータを使用します。
ドキュメントはこちら: 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