私はボトルレストAPIを作成していますが、一部のエンドポイントで関数デコレータを使用して認証ユーザーにしたいと考えています。 Decoratorのコードは次のとおりです。Pythonデコレータのエラー処理
def authenticating_decorator(func):
def wrapper():
try:
'''
auth user before execution of the required code
if user is not authenticated bottle.HTTPError is raised
'''
auth()
return func
except HTTPError as e:
return handle_auth_error
return wrapper()
return authenticating_decorator
ハンドル認証エラー関数:
def handle_auth_error(error):
return {
"code": error.status_code,
"name": error.body.get('name'),
"description": error.body.get('description')
}
すべてが例外をキャッチし、必要なJSONに変換するために、私はボトルのプラグインがインストールされていることを除いて正常に動作しているとAPIレスポンスが/コンテンツtypeapplicationを持っていますjson
authメソッドで例外が発生した場合、何らかの理由でエラープラグインがスキップされるため、APIは既知のHTML形式でエラーを返します。
def __call__(self, callback):
def wrapper(*a, **kw):
try:
rv = callback(*a, **kw)
return rv
except HTTPError as e:
response.status = e.status_code
return {
"code": e.status_code,
"name": e.body.get('name'),
"description": e.body.get('description')
}
return wrapper
私のポイントは、私は理由ラインのプラグインに関数を渡す必要があるということです。私のエラープラグインの
Callメソッド(プラグインやデコレータの両方を使用したとき、私は完全にアプリケーションのフローを理解していないmahbe) RV =コールバック(* A、**キロワット)
と私はAUTH()デコレータのメソッドで例外の複数のタイプを持っているので、私はデコレータにhandle_auth_error
に引数として例外を渡したい
しかし、私はreturn handle_auth_error(e)
を入力する場合、この関数はdictのではなく、関数を返すと私は例外のdictオブジェクトを取得しています、私はデコレータでそれを呼び出すことが、それを呼び出すwithouthデコレータからの引数を持つ関数を返すことができますどのようにコード行でrv = callback(*a, **kw)
呼び出すことはできませんプラグイン? または、プラグインへのパラメータとして例外をどのように渡すことができますか?
可能な解決策は、例外名に基づいて「スイッチ」ステートメントを使用してすべての可能な例外のために処理するために独自の関数を作成しているが、私はより多くのprogramicallyそれをやりたい:
return {
'HEADER_MISSING': handle_header_missing_exception,
'TOKEN_EXPIRED': handle_expired_token_exception,
etc ... : etc...
}.get(e.body.get('name'))