2017-06-26 18 views
1

私はボトルレスト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')) 

答えて

0

私はあなたのデコレータが書かれていないと思います正しくはありません:

def authenticating_decorator(func): 
    @functools.wraps(func) 
    def wrapper(*args, **kw): 
     try: 
      ''' 
      auth user before execution of the required code 
      if user is not authenticated bottle.HTTPError is raised 
      ''' 
      auth() 
      return func(*args, **kw) #calling func here 
     except HTTPError as e: 
      return handle_auth_error(e) #calling the handle_auto_error here 

return wrapper #notice - no call here, just return the wrapper 
関連する問題