私はこのdocからPythonデコレータを理解しようとしています。 API Exceptionsを処理するために必要な自分のデコレータを作成していました。パラメータ付きデコレータのパラメータへのアクセス
私のデコレータでは、カスタムデコレータ内で引数(method
、api
、data
)にアクセスする方法がありません。
私が知っている通り、私はどこに行っても私はデコレータで受け入れることができないので、どこにでもmethod
を渡していません。ここで
は私のデコレータです:
import requests as r
import json
def handle_api_exceptions(http_api_call):
""" """
def wrapper(*args, **kwargs):
""" """
response = {}
try:
response = http_api_call(*args, **kwargs)
if response.ok:
result = response.json()
if result.get('code', 200) in INVALID_STATUS_CODES: #INVALID_STATUS_CODES = [1801, 1803, 1806,... ]
response = {"data":{}, "status":False}
else:
return result
else:
capture_failed_requests(method, api, data, response,
error=None, reason=response.reason)
return {}
except r.exceptions.ConnectionError as e:
capture_failed_requests(method, api, data, response, error=e,
reason="Connection Aborted")
return {}
except json.decoder.JSONDecodeError as e:
capture_failed_requests(method, api, data, response, error=e,
reason="Invalid Response")
return {}
except r.exceptions.ReadTimeout as e:
capture_failed_requests(method, api, data, response, error=e,
reason="Request Timed Out")
return {}
except Exception as e:
capture_failed_requests(method, api, data, response, error=e,
reason="Internal Server Error")
return {}
return wrapper
カスタムGET、POSTのAPIリクエスト:
@handle_api_exceptions
def get(self, api, data, token=None):
""" """
if token:data.update(self.get_token(token))
response = r.get(api, data, verify=self.config.SSL_VERIFY,
timeout=self.config.REQUEST_TIMEOUT)
return response
@handle_api_exceptions
def post(self, api, data, token=None):
""" """
if token:
data.update(self.get_secret_token(token))
response = r.post(api, data, verify=self.config.SSL_VERIFY,
timeout=self.config.REQUEST_TIMEOUT)
return response
def post_call(self):
""" """
api = "http://192.168.0.24/api/v1/reset/"
data = {"k1":[], "k2":{}, "id":123456} #-- Some Key val
return self.post(api, data, token="SOME_SECRET_TOKEN")
クエリは次のとおりです。method
、api
、およびcapture_failed_requests()
でdata
を渡す方法は?
現在書かれているように 'method'を渡すことはできませんが、' data'と 'api'は' args'の中にあります。 – jonrsharpe
@jonrsharpe:どこからでもハードコーディングされたメソッド= "GET"またはメソッド= "POST"を渡すことはできますか? – Laxmikant
はい、それをデコレータに直接渡すことができます: '@handle_api_exceptions(method = 'GET')'。心に留めて:http://stackoverflow.com/q/5929107/3001761 – jonrsharpe