【问题标题】:Is there a way to raise server status code as a client?有没有办法将服务器状态代码作为客户端提升?
【发布时间】: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


【解决方案1】:

从您的代码来看,您似乎正在尝试触发一个应该在发生请求错误时触发的操作。但是,状态代码来自服务器,并且不受客户端控制。如果服务器返回 200,则表示它已正确接收并响应您的请求。

装饰器由aiohttp.ClientError 类型的任何异常触发。因此,要手动触发它,您只需要引发该类型(或其任何派生类型)的异常。 Please refer to this page for the list of all aiohttp exceptions.

因此,当您在服务器响应中发现错误时,您可以使用以下方法引发异常:

raise aiohttp.ClientError('Server response is empty')

【讨论】:

    【解决方案2】:

    假设你正在运行SimpleHTTPServer,最简单的方法是使用SimpleHTTP404Server

    你可以通过运行简单地安装它

    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.")
    

    【讨论】:

      猜你喜欢
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 2012-06-16
      相关资源
      最近更新 更多