Вызов Django ORM запросов из асин c функции, выполняемой в цикле событий - PullRequest
1 голос
/ 10 марта 2020

[Настройка] Я использую Django 3.0 в качестве приложения wsgi.

Мне нужно запустить сопрограмму (показанную ниже) из вида. Это выполняется в asyncio eventl oop. Из этого цикла событий / сопрограммы мне нужно получить некоторые объекты в базе данных, используя ORM Django, но django выдает следующее исключение:

django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async

import asyncio
import concurrent

def get_users_from_db():
    return User.objects.all()

async def do_some_async_stuff():
    executor = concurrent.futures.ThreadPoolExecutor(max_workers=3)
    loop = asyncio.get_event_loop()
    attachments = await loop.run_in_executor(executor, get_users_from_db)

def view(request):
    task = LOOP.create_task(do_some_async_stuff)
    result = not LOOP.is_running() and LOOP.run_until_complete(task)

I Я не уверен, что я делаю неправильно. Насколько я понимаю, Django делает c предполагает, что я должен иметь возможность запускать синхронные задачи (например, запрос ORM) в отдельном потоке, но это все равно не работает.

Интересно то, что запуск кода локально с использованием manage.py runserver работает нормально, однако запуск его с помощью `gunicorn --bind 127.0.0.1:8000 sr c .config.wsgi: приложение выдает вышеупомянутое исключение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...