【发布时间】:2020-11-03 02:10:42
【问题描述】:
有时由于糟糕的服务器设计,我会得到状态码 200,但它应该不同。
在这种情况下,我自己如何在客户端提出适当的响应(例如404)。这将起到模仿服务器返回的作用?
我通过django 看到了一些answers。这是唯一的方法吗?
我也没有在标准 python 异常here 中看到任何此类内容。为什么通过标准的 python 异常不可能做到这一点?
这是我现在的处理方式:
import time
import aiohttp
import backoff
@backoff.on_exception(backoff.expo, aiohttp.ClientError, max_tries=5, max_time=5)
async def _fetch_url(session, url, msg_handler):
downtime = 1
while downtime < 60:
async with await session.get(url, raise_for_status=True) as response:
result = await msg_handler(response, url)
# empty results means an error in request but status code 200.
if len(result) == 0:
downtime = downtime * 2
time.sleep(downtime)
else:
return result
【问题讨论】:
-
您是否在 Python 上运行 Web 服务器?如果是这样,您使用的是什么服务器/库?
-
不,我不是。有时当我发出 url 请求(对于 json 格式的数据)我得到 200,但在 json 内部我得到一个错误。就我而言 - 我希望能够在这种情况下手动引发 404。
-
当你说“url request”时,你指的是来自客户端的请求(例如
requests.get())? -
客户端无法引发 404。这是服务器发送的内容。如果您发出请求并收到 200,则表示服务器已正确接收并响应您的请求。如果在处理响应时出现错误(来自客户端),则这不是 404 并且与服务器完全无关。您要解决的问题是什么?
-
我明白了。在这种情况下,服务器应该使用正确的状态码(例如 500 或 504)进行响应。如果它在错误时返回 200,那么在服务器端这是一个糟糕的设计。至于客户端,您需要找到一种不同的方式来触发退避功能,例如当数据有问题时引发异常。
标签: python exception python-requests http-status-code-404