Python — попытка декодировать JSON с неожиданным MIME-типом:

Недавно я переключился с запросов на aiohttp, потому что не мог использовать его в циклах asyncio.

Свап прошел отлично, и все идет хорошо, кроме одного. Моя консоль заполнена

Attempt to decode JSON with unexpected mimetype:

а также

Attempt to decode JSON with unexpected mimetype: txt/html; charset=utf-8

В моем коде есть список сайтов, с которых он идет и получает JSON. Каждый сайт отличается, но мой цикл в основном одинаков для каждого из них, я упростил его здесь:

PoolName = "http://website.com"
endpoint = "/api/stats"
headers = "headers = {'content-type': 'text/html'}" #Ive tried "application/json" and no headers
async with aiohttp.get(url=PoolName+endpoint, headers=headers) as hashrate:
                hashrate = await hashrate.json()
endVariable = hashrate['GLRC']['HASH']

Он отлично работает, подключается к сайту, захватывает json и правильно устанавливает endVariable. но почему-то

Attempt to decode JSON with unexpected mimetype:

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

Есть ли способ исправить эту ошибку или скрыть ее?


person pfych    schedule 17.02.2018    source источник


Ответы (2)


aiohttp пытается поступить правильно и предупредить вас о неверных Content-Type, что в худшем случае может означать, что вы вообще не получаете данные JSON, а что-то несвязанное, например HTML-содержимое страницы с ошибкой.

Однако на практике многие серверы неправильно настроены, чтобы всегда отправлять неправильный тип MIME в своих ответах JSON, и библиотекам JavaScript, по-видимому, все равно. Если вы знаете, что имеете дело с таким сервером, вы всегда можете отключить предупреждение, вызвав json.loads самостоятельно:

import json
# ...

async with self._session.get(uri, ...) as resp:
    data = await resp.read()
hashrate = json.loads(data)

Указание Content-Type, как вы пытались, не имеет значения, поскольку оно влияет только на Content-Type вашего запроса, тогда как проблема заключается в Content-Type ответа сервера, который не находится под вашим контролем. .

person user4815162342    schedule 17.02.2018

Передайте ожидаемый тип контента методу json():

data = await resp.json(content_type='text/html')

или полностью отключить проверку:

data = await resp.json(content_type=None)
person Andrew Svetlov    schedule 17.02.2018
comment
➕1, я не знал, что вы можете отключить проверку или настроить ожидаемый заголовок. - person user4815162342; 17.02.2018