Python - 尝试使用意外的MIME类型解码JSON

36

最近我因为无法在asyncio循环中使用requests而转换成了aiohttp。

转换很完美,一切都很好,除了一个问题:我的控制台充满了

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时都会丢失

有没有办法修复此错误或隐藏它?

2个回答

70
将期望的内容类型传递给json()方法:
data = await resp.json(content_type='text/html')

或者完全禁用检查:

data = await resp.json(content_type=None)

5
我不知道你可以关闭检查或自定义预期的标题。 - user4815162342
动态设置 content_type 对我很有用:data = await resp.json(content_type=resp.content_type)。但不确定是否正确。 - 555Russich
基本上,它的工作方式与content_type=None相同。 - Andrew Svetlov

34

aiohttp试图做正确的事情并警告您有关不正确的Content-Type的信息,最坏的情况可能是您根本没有获得JSON数据,而是一些不相关的内容,例如错误页面的HTML内容。

然而,在实践中,许多服务器未正确配置以在其JSON响应中始终发送不正确的MIME类型,而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,这是你无法控制的。{{}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接