2

いくつかのヘルパーデコレーターを提供するフラスコ認証を使用しています。authorized_handler以下にさまざまなメソッドをすべて追加しましたが、質問したいのは、デコレータによってスローされた問題をどのようにキャッチするかということです。デコレータに関する一般的な質問ですが、実際の例が役立つと思いました。

デコレータが爆発した場合、どうすればキャッチできますか?

import os
import flask
import flask_oauth

CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']

oauth = flask_oauth.OAuth()
twitter = oauth.remote_app(
    'twitter',
    base_url='https://api.twitter.com/1/',
    request_token_url='https://api.twitter.com/oauth/request_token',
    access_token_url='https://api.twitter.com/oauth/access_token',
    authorize_url='https://api.twitter.com/oauth/authenticate',
    consumer_key=CONSUMER_KEY,
    consumer_secret=CONSUMER_SECRET
)

app = flask.Flask(__name__)

@app.route('/login')
def login():
    return twitter.authorize(
        callback=url_for(
            'oauth_authorized',
            next=request.args.get('next') or request.referrer or None)
    )

@app.route('/oauth-authorized')
# what happens if this raises an error?
@twitter.authorized_handler
def oauth_authorized(resp):
    print 'foo-bar'
4

1 に答える 1

3

関数定義が実行されます。したがって、発生した例外がそのデコレーターに固有のものであると仮定すると、デコレーターを含む関数定義を次のようにラップできますtry/except

try:
    @app.route('/oauth-authorized')
    @twitter.authorized_handler
    def oauth_authorized(resp):
        print 'foo-bar'
except WhateverError as e:
    print "twitter.authorized_handler raised an error", e

もちろん、oauth_authorized例外が発生した場合、これは未定義のままになります。とにかくルーティングされたくないので、これはおそらく問題ありません。exceptしかし、これが望ましくない場合は、ダミーの定義をブロックに追加できます。

または、デコレータは単なる関数 (つまり、呼び出し可能なもの) であり、表記法は関数呼び出しの構文糖衣にすぎないため、装飾@だけを でラップできます。authorized_handlertry/except

def oauth_authorized(resp):
    print 'foo-bar'
try:    # apply decorator
    oauth_authorized = twitter.authorized_handler(oauth_authorized)
except Exception as e:
    print "twitter.authorized_handler raised an error", e
else:   # no error decorating with authorized_handler, apply app.route
    oauth_authorized = app.route('/oauth-authorized')(oauth_authorized)

これにより、装飾が失敗した場合、関数の装飾されていないバージョンが残りますauthorized_handlerが、ルーティングされません。上記を独自の関数に入れて、デコレータとして使用することもできます!

于 2013-06-10T21:38:01.420 に答える