Как запустить асинхронную функцию в представлении Django?
Я пытаюсь сделать следующее:
def tools(request):
ids = get_ids()
print(ids)
return render(request, 'strava_tools/tools.html')
def get_ids():
ids = []
async def main():
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
loop = asyncio.get_event_loop()
futures = [
loop.run_in_executor(
executor,
requests.get,
'https://www.strava.com/api/v3/athlete/activities?page={page}&per_page=200&access_token=11111111'.format(page=page)
)
for page in range(1,4)
]
for response in await asyncio.gather(*futures):
for activity in response.json():
ids.append(activity['id'])
pass
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
return ids
Но выдает ошибку:
RuntimeError: в потоке 'Thread-4'
нет текущего цикла событий
Функция get_ids
, однако, прекрасно работает, когда запускается сама по себе в отдельном модуле.
Дополнительно, это хорошая идея, чтобы сделать функцию неблокирующей для цикла запрос-ответ Django (чтобы можно было визуализировать tools.html
до завершения функции get_ids
), чтобы повернуть get_ids
функция в задаче сельдерея?