Python 有没有办法将服务器状态代码提升为客户端?
有时由于糟糕的服务器设计,我得到的状态代码是200,而它应该是不同的 在这种情况下,我自己如何在客户端提出适当的响应(例如Python 有没有办法将服务器状态代码提升为客户端?,python,exception,python-requests,http-status-code-404,Python,Exception,Python Requests,Http Status Code 404,有时由于糟糕的服务器设计,我得到的状态代码是200,而它应该是不同的 在这种情况下,我自己如何在客户端提出适当的响应(例如404)。这将用作模拟,就好像它是由服务器返回的一样 我通过django看到了一些。这是唯一的办法吗 在标准python异常中,我也没有看到任何类似的情况。为什么通过标准的python异常不能实现这样的事情 下面是我现在处理这个问题的方法: import time import aiohttp import backoff @backoff.on_exception(b
404
)。这将用作模拟,就好像它是由服务器返回的一样
我通过django
看到了一些。这是唯一的办法吗
在标准python异常中,我也没有看到任何类似的情况。为什么通过标准的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
导入时间
进口aiohttp
进口退保
@backoff.on_异常(backoff.expo、aiohttp.ClientError、max_trys=5、max_time=5)
异步定义获取url(会话、url、消息处理程序):
停机时间=1
停机时间<60时:
与wait session.get(url,raise_for_status=True)异步作为响应:
结果=等待消息处理程序(响应,url)
#空结果表示请求中有错误,但状态代码为200。
如果len(结果)==0:
停机时间=停机时间*2
时间。睡眠(停机时间)
其他:
返回结果
假设您正在运行SimpleHTTPServer
,最简单的方法是使用
您可以通过运行来简单地安装它
pip install SimpleHTTP404Server
浏览到该目录,并运行以下命令将其发送到端口8000上
python -m SimpleHTTP404Server
例外情况应属于以下类别之一:
- 语法错误
- 处理异常
- 提出例外情况
# define Python user-defined exceptions
class Error(Exception):
"""Base class for other exceptions"""
pass
class ValueTooSmallError(Error):
"""Raised when the input value is too small"""
pass
class ValueTooLargeError(Error):
"""Raised when the input value is too large"""
pass
# you need to guess this number
number = 10
# user guesses a number until he/she gets it right
while True:
try:
i_num = int(input("Enter a number: "))
if i_num < number:
raise ValueTooSmallError
elif i_num > number:
raise ValueTooLargeError
break
except ValueTooSmallError:
print("This value is too small, try again!")
print()
except ValueTooLargeError:
print("This value is too large, try again!")
print()
print("Congratulations! You guessed it correctly.")
#定义Python用户定义的异常
类错误(异常):
“”“其他异常的基类”“”
通过
类值TooSmallError(错误):
“”“当输入值太小时引发”“”
通过
类ValueTooLargeError(错误):
“”“当输入值太大时引发”“”
通过
#你需要猜这个数字
数字=10
#用户猜测一个数字,直到他/她猜对为止
尽管如此:
尝试:
i_num=int(输入(“输入一个数字”))
如果i_num<数字:
将值提升到最小错误
elif i_num>编号:
升值工具误差
打破
除ValueTooSmallError外:
打印(“此值太小,请重试!”)
打印()
除ValueTooLargeError外:
打印(“此值太大,请重试!”)
打印()
打印(“恭喜!你猜对了。”)
从您的代码来看,您似乎试图触发一个在请求错误发生时应该触发的操作。但是,状态代码来自服务器,不受客户端控制。如果服务器返回200,则表示它已正确接收并响应您的请求
修饰符由类型为aiohttp.ClientError
的任何异常触发。因此,要手动触发它,只需引发该类型(或其任何派生类型)的异常
因此,当您在服务器响应中发现错误时,可以使用以下方法引发异常:
raise aiohttp.ClientError('Server response is empty')
您是否在Python上运行web服务器?如果是这样,您使用的是什么服务器/库?不,我不是。有时,当我发出一个url请求(对于json格式的数据)时,我得到200,但在json中我得到一个错误。在我的情况下-在这种情况下,我希望能够手动提出404。当你说“url请求”时,你指的是来自客户端的请求(例如
requests.get()
)?客户端不能提出404。这是服务器发送的内容。如果您发出请求并收到200,则表示服务器已正确接收并响应您的请求。如果存在与处理响应相关的错误(来自客户端),则这不是404,也与服务器无关。你想解决的问题是什么?我明白了。在这种情况下,服务器应该使用正确的状态代码(例如500或504)进行响应。如果它返回200个错误,那么在服务器端这是一个糟糕的设计。对于客户端,您需要找到一种不同的方式来触发回退功能,例如,在数据出现问题时引发异常。