Как сделать несколько вызовов API с запросами Python - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь выполнять параллельные вызовы внешнего API от django, используя запросы или любую другую библиотеку, которая позволяет мне это делать.

Я уже пытался использовать греквесты для выполнения этих вызовов, иногда это работает, но в большинстве случаев я получаю, что объект 'NoneType' не имеет ошибки атрибута 'json' на стороне клиента. Вот мои коды

views.py

def get_fixtures(request, league_id):
league_id = league_id

urls = [
    "https://api-football-v1.p.rapidapi.com/v2/fixtures/league/%d" % league_id,
    "https://api-football-v1.p.rapidapi.com/v2/leagues/league/%d" % league_id
]
headers = {'X-RapidAPI-Host': "api-football-v1.p.rapidapi.com", 'X-RapidAPI-Key': X_RapidAPI_Key}
resp = (grequests.get(u, headers=headers) for u in urls)
responses = grequests.map(resp)
a = responses[0].json()
b = responses[1].json()
fix_1 = a['api']['fixtures']
api_2 = b['api']['leagues']

context = {

    'fix_1': fix_1,
    'api_2': api_2,
}

return render(request, "pages/fixtures.html", context)

На стороне сервера я получаю эту ошибку:

File "src\gevent\_greenlet_primitives.py", line 60, in 
gevent.__greenlet_primitives.SwitchOutGreenletWithLoop.switch
File "src\gevent\_greenlet_primitives.py", line 64, in 
gevent.__greenlet_primitives.SwitchOutGreenletWithLoop.switch
File "src\gevent\__greenlet_primitives.pxd", line 35, in 
gevent.__greenlet_primitives._greenlet_switch
greenlet.error: cannot switch to a different thread.

Могу ли я использовать запросы или любую другую библиотеку для выполнения вызовов без получения этих ошибок? если да, то как мне реализовать это в моей работе?

1 Ответ

0 голосов
/ 06 июля 2019

Попробуйте разместить это:

resp = list(grequests.get(u, headers=headers) for u in urls)
...