Есть ли способ поднять код статуса сервера как клиента? - PullRequest
0 голосов
/ 13 июля 2020

Иногда из-за плохой конструкции сервера я получаю код состояния 200, хотя он должен быть другим.

В таких случаях, как я могу сам на стороне клиента вызвать соответствующий ответ (например, 404). Это будет служить mimi c, как если бы оно было возвращено сервером?

Я видел несколько ответов через 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

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Судя по вашему коду, вы пытаетесь запустить действие, которое должно запускаться при возникновении ошибки запроса. Однако коды состояния поступают от сервера и не контролируются клиентом . Если сервер возвращает 200, это означает, что он получил ваш запрос и ответил на него правильно.

Декоратор запускается любым исключением типа aiohttp.ClientError. Итак, чтобы вызвать его вручную, вам просто нужно вызвать исключение этого типа (или любых его производных типов). Пожалуйста, обратитесь к этой странице для получения списка всех aiohttp исключений .

Итак, вы можете просто использовать следующее, чтобы вызвать исключение, когда вы обнаружите ошибку в ответе сервера:

raise aiohttp.ClientError('Server response is empty')
0 голосов
/ 13 июля 2020

Предполагая, что вы используете 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.")
...