1

私は次のようにlogin_requiredデコレータを持っています:

def login_required(function):
  """ Decorator to check Logged in users."""
  def check_login(self, *args, **kwargs):
    if not self.auth.get_user_by_session():
      self.redirect('/_ah/login_required')
    else:
      return function(self, *args, **kwargs)
  return check_login

これで、Page(個別にレンダリングされるHandler)があり、ゲストとユーザーの両方が表示できる画像をユーザーがアップロードするためのオプションがあります。フォームが投稿されるとすぐに、デコレータHandlerを使用する別のフォームによって処理されます。@login_required

私が達成したいのは、ユーザーがログイン後に同じページにリダイレクトされるように、リダイレクト中continue_urlに関数で使用できる変数を渡すことです。check_login

4

2 に答える 2

3

このcreate_login_url関数は、最初のパラメーターとして宛先URLを取ります。dest_urlはリクエストオブジェクトから取得できます。

def login_required(func):

    def _wrapper(request, *args, **kw):
        user = users.get_current_user()
        if user:
            return func(request, *args, **kw)
        else:
            return request.redirect(users.create_login_url(request.get_url()))

    return _wrapper
于 2012-05-20T17:04:57.047 に答える
2

つまり、基本的には、デコレータを使用するときに引数を渡したいように思えます。Pythonはこれをサポートしています。基本的な考え方は、@decorated(argument) def foo(...)と同等def foo(...); foo = decorated(argument)(foo)です。

だからあなたは飾ることができるdecoratedようなものにする必要があります。これにはいくつかのレシピがあります。これが1つです-メソッドを使用してクラスを作成します。これは、呼び出されたときにそれを格納して使用する呼び出し可能なオブジェクトです。decorated(argument)foodecorated__call__decorated(argument)argument

class decorator(object):
    def __init__(argument):
        self.argument = argument

    def __call__(self, wrapped):
        def wrapper(args_for_wrapped):
            do_something_with(self.argument)
            wrapped(args_for_wrapped)
            whatever_else_this_needs_to_do()
        return wrapper

これは、単純な関数(および追加レベルのネスト)や、関連するトリックfunctools.partialなどを使用して実現することもできます。

于 2012-05-20T17:05:01.977 に答える