1

このデコレータを作成したところ、無限のリダイレクト ループが発生しました。

問題はこれです:

args[0].redirect(users.create_login_url(args[0].request.path))

完全に有効な URL のようです。では、なぜ適切にリダイレクトしないのでしょうか?

def admin_only(handler, *args):

    def redirect_to_login(*args, **kwargs):
        return args[0].redirect(users.create_login_url(args[0].request.path))

    user = users.get_current_user()
    if user:
        if authorized(user):
            return handler(args[0])
        else:
            logging.warning('An unauthorized user has attempted to enter an authorized page')
            return redirect_to_login
    else:
        return redirect_to_login
4

4 に答える 4

2

デコレータを適切に定義していないようです。

デコレーターは、関数をラップするたびに一度だけ呼び出されます。それ以降、デコレータが返した関数が呼び出されます。デコレータ関数自体が毎回呼び出されると(誤って)信じているようです。

代わりに次のようにしてみてください。

def redirect_to_login(*args, **kwargs):
    return args[0].redirect(users.create_login_url(args[0].request.path))

def admin_only(handler):
    def wrapped_handler(*args, **kwargs):    
        user = users.get_current_user()
        if user:
            if authorized(user):
                return handler(args[0])
            else:
                logging.warning('An unauthorized user has attempted '
                                'to enter an authorized page')
                return redirect_to_login(*args, **kwargs)
        else:
            return redirect_to_login(*args, **kwargs)

    return wrapped_handler

上記のコードでは、デコレータは新しい関数を定義してそれを返すだけであり、この新しい関数自体が関連するチェックを行うことに注意してください。

于 2008-12-02T11:11:45.487 に答える
0

適切なステータス コードが送信されていることを確認してください。Firefox 用のライブ HTTP ヘッダー アドオンを使用して、301 または 303 が送信されているかどうかを確認できます。

于 2008-12-02T10:43:07.023 に答える
0

ここで何が起こっているのかを正確に確認するには、firebug、またはライブ http ヘッダーなどを使用する必要があります。私の推測:あなたのauthorized()関数は(ユーザーがログインしている場合でも)常にfalseを返すため、ログインページにリダイレクトされ、(ユーザーがすでにログインしている場合)すぐにユーザーをあなたのページにリダイレクトします。リダイレクト...あなたはアイデアを得る。

于 2008-12-02T11:10:45.550 に答える
0

問題は実際に使用するときです

return args[0].redirect(users.create_logout_url(args[0].request.uri))

これはログアウト ページに移動し、現在のページにリダイレクトされます。ただし、ログアウトが完了した後でも、現在のページではまだログインしていると見なされていることがログに示されています。

アプリ エンジン ユーザー API で何も変更していないため、これは奇妙です。

于 2008-12-02T18:37:27.567 に答える