Python 有没有办法将服务器状态代码提升为客户端?

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

有时由于糟糕的服务器设计,我得到的状态代码是200,而它应该是不同的

在这种情况下,我自己如何在客户端提出适当的响应(例如
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个错误,那么在服务器端这是一个糟糕的设计。对于客户端,您需要找到一种不同的方式来触发回退功能,例如,在数据出现问题时引发异常。