如何在 Python 应用程序中处理 HTTP 状态代码?
How to handle HTTP Status Codes across a Python application?
我正在尝试标准化我对从各种 API 返回的 HTTP 状态代码的处理,以减少我跨文件复制的代码量。
对于我当前的应用程序,我有一组文件,每个文件都包含一个 class,它们都继承自一个主 class。我正在使用 Python 请求模块来使用 APIs.
到目前为止,我已经在每个函数中编写了自定义状态代码处理以继续 200,记录我用 400 发送的请求,记录 404 的 url,重试 5xx,但是跨函数和 classes.
继续复制此代码很麻烦
我正在考虑以下内容(请注意,我在这里简化了我的代码以仅使用 GET,但实际上,我主要是发布和接收 json 响应):
apiMaster.py
class ApiMaster(object):
def _handle_response(self, resp):
if resp.status_code == 200: # or requests.code.ok
return resp.json()
if resp.status_code == 400:
err_msg = "400 Error - Bad Request\n" + resp.request.url + "\n" + resp.request.data
raise HTTPError(err_msg)
...
apiA.py
class Api_A(ApiMaster):
def query_json_a(self):
resp = requests.get(self.url + '/a.json')
try:
resp_json = self._handle_response(resp)
except HTTPError as e:
logger.error(str(e))
apiB.py
class Api_B(ApiMaster):
def query_json_b(self):
# same as API A but with different endpoints and purpose
然而,这似乎仍然有问题。我不知道尝试解释 API 返回的每个状态代码是否合理。这还需要我将此代码复制到我开始处理的任何新项目中。
有更好的方法吗?
您的解决方案看起来不错,您可以通过将更多内容移动到共享方法中来进一步完善它,例如
class ApiMaster(object):
def make_request(self, url, method, query_params=None, body=None, logger=None):
if not logger:
get_default_logger_somehow()
response = requests.request(method, url, params=query_params, json=body)
if response.status_code == 400:
logger.error(response.request.url)
elif response.status_code == 200:
try:
return reponse.json()
except SomeError:
return None
class Api1(ApiMaster):
json = self.make_request('post', 'http://example/com')
我正在尝试标准化我对从各种 API 返回的 HTTP 状态代码的处理,以减少我跨文件复制的代码量。
对于我当前的应用程序,我有一组文件,每个文件都包含一个 class,它们都继承自一个主 class。我正在使用 Python 请求模块来使用 APIs.
到目前为止,我已经在每个函数中编写了自定义状态代码处理以继续 200,记录我用 400 发送的请求,记录 404 的 url,重试 5xx,但是跨函数和 classes.
继续复制此代码很麻烦我正在考虑以下内容(请注意,我在这里简化了我的代码以仅使用 GET,但实际上,我主要是发布和接收 json 响应):
apiMaster.py
class ApiMaster(object):
def _handle_response(self, resp):
if resp.status_code == 200: # or requests.code.ok
return resp.json()
if resp.status_code == 400:
err_msg = "400 Error - Bad Request\n" + resp.request.url + "\n" + resp.request.data
raise HTTPError(err_msg)
...
apiA.py
class Api_A(ApiMaster):
def query_json_a(self):
resp = requests.get(self.url + '/a.json')
try:
resp_json = self._handle_response(resp)
except HTTPError as e:
logger.error(str(e))
apiB.py
class Api_B(ApiMaster):
def query_json_b(self):
# same as API A but with different endpoints and purpose
然而,这似乎仍然有问题。我不知道尝试解释 API 返回的每个状态代码是否合理。这还需要我将此代码复制到我开始处理的任何新项目中。
有更好的方法吗?
您的解决方案看起来不错,您可以通过将更多内容移动到共享方法中来进一步完善它,例如
class ApiMaster(object):
def make_request(self, url, method, query_params=None, body=None, logger=None):
if not logger:
get_default_logger_somehow()
response = requests.request(method, url, params=query_params, json=body)
if response.status_code == 400:
logger.error(response.request.url)
elif response.status_code == 200:
try:
return reponse.json()
except SomeError:
return None
class Api1(ApiMaster):
json = self.make_request('post', 'http://example/com')