0

「auth」という名前のデコレータがあります

def auth(check_func=validate_login):
    def decorator(view):
        def wrapper(*args, **kwargs):
            auth = check_func()
            if auth:
                return view(*args, **kwargs)
            return bottle.redirect('/login.html')
        return wrapper
    return decorator

authデコレータはこのように使用されます

@get('/')
@view("someview")
@auth()
def handler():
   #myhandlercode

そのため、authデコレータviewは私のテンプレートを bottle.py にレンダリングする関数を呼び出します。しかし、今はレンダリングする代わりにjsonを返したいview. これを実現するには、デコレータ コードにどのような変更を加える必要がありauthますか? view認証コードからの代わりにハンドラーを呼び出す方法について混乱しています。

編集 1: ボトルを使用すると、dict を返すことができます。直接 json に変換します。そして、ビューをまったく使用したくありません。ハンドラーからjsonをユーザーに返したいだけです。@viewデコレータを削除するだけですか?認証デコレータで代わりに何を呼び出す必要がありますか?

4

3 に答える 3

3

ボトルルートデコレータは、autojson機能を破棄せずにデコレータを適用できます。

@get('/', apply=[auth])
def handler():
    ...

ビューが必要ない場合は、@viewデコレータを削除するだけです。ボトルハンドルが適切にディクテーションし、JSON回答に変換します。

于 2011-12-25T14:00:01.483 に答える
1

json ダンプで認証シューホーニングを使用する権利があるとは思いません。

これは、デコレータを使用するプレーンな ol python の例です

def validate():
    return True

def auth(valid=validate):
    def _auth(f):
        def _auth_wrap():
            if not valid():
                raise Exception('redirect')
            return f()
        return _auth_wrap
    return _auth

def view(tmpl):
    def _view(f):
        def _view_wrap():
            return tmpl.format(f())
        return _view_wrap
    return _view

@view('Hello, {0}')
@auth()
def handler():
    return 'World'

handler
# outputs: __main__._view_wrap
handler()
# outputs: 'Hello, World'

そしてラインも

return tmpl.format(f())

ffunc は、__main__._auth_wrapvalidate を呼び出し、実行されたハンドラーを返すものです。

したがって、別のメソッドを呼び出して必要な情報を渡す、ビュー デコレータにシューホーニングするなど、上記の tmpl.format 以外の方法で json のダンプを処理します。どちらの方法もより適切です。

したがって、最後の質問にもう少しよく答えるために、リクエストに基づいて json をダンプするかどうかを動的に決定したい場合、および bottle.py のビュー関数がこれをサポートしていない場合は、上記のようなビュー ラッパーを作成できます。リクエストオブジェクトまたはjson出力を決定するために使用したいものをチェックし、_view_wrapf()内でbottle.pyのビューまたはjson.dumpsを呼び出します

func が常に json をダンプするようにしたい場合は、ビュー デコレータを削除し、上記のビュー デコレータと同様の json デコレータを作成します。return json.dumps(f())

ここでの主なポイントは、auth がその名前が意味することを実行し続けることです。

于 2011-12-23T21:56:01.480 に答える
0

ビューから Json (またはむしろ Python 辞書) を返していますよね? その場合、デコレータで何も変更する必要はありません。ビューが返すものは、すぐにユーザーのブラウザーに転送されるのではなく、最初にボトルによって処理されてから、ユーザーに返されます。ビューから辞​​書を返すときは Json として扱われ、テンプレート文字列を返すときは Html として扱われます。

于 2011-12-23T21:46:19.940 に答える