Как вызвать asyncio def из представления Django (и сделать его неблокирующим)? - PullRequest
0 голосов
/ 18 января 2019

Как запустить асинхронную функцию в представлении 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 функция в задаче сельдерея?

...