web-dev-qa-db-ja.com

Python-予期しないMIMEタイプでJSONをデコードしようとしました:

Asyncioループで使用できないため、最近リクエストからaiohttpに切り替えました。

スワップは完全に行われ、1つを除いてすべてがうまくいきました。私のコンソールはいっぱいです

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を取得するたびにエラーで失われるので、迷惑です。

このエラーを修正または非表示にする方法はありますか?

8
Puffycheeses

aiohttp正しいことをして警告する が正しくないContent-Typeを試みています。これは、最悪の場合、JSONデータをまったく取得していないが、関連性のないものを示している可能性があります。エラーページのHTMLコンテンツなど。

ただし、実際には、多くのサーバーがJSON応答でalways誤った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のサーバーの応答。これはユーザーの制御下にありません。

15
user4815162342

予想されるコンテンツタイプをjson()メソッドに渡します。

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

またはチェックを完全に無効にします:

data = await resp.json(content_type=None)
18
Andrew Svetlov