В Django 3.0 добавлена поддержка asgi / async, а вместе с ним - защита от выполнения синхронных запросов в асинхронном контексте . Одновременно IPython только что добавил поддержку асинхронного / ожидающего ожидания верхнего уровня , которая, кажется, выполняет весь сеанс интерпретатора внутри цикла событий по умолчанию.
К сожалению, сочетание этих двух замечательных дополнений означает, что любая операция django ORM в ноутбуке jupyter вызывает SynchronousOnlyOperation
исключение:
SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
Как говорится в сообщении об исключении, можно обернуть каждый вызов ORM sync_to_async()
следующим образом:
images = await sync_to_async(Image.objects.all)()
но это не очень удобно, особенно для связанных полей, которые обычно неявно разрешаются при поиске атрибутов.
(Я попробовал %autoawait off
магию, но она не сработала, из-за быстрого взгляда на документы, я предполагаю, что это потому, что ipykernels всегда работают в цикле asyncio)
Так есть ли способ отключить синхронизацию в асинхронной проверке контекста в django или запустить ipykernel в синхронном контексте?
Для контекста: я написал пакет данных науки, который использует django в качестве внутреннего сервера, но также предоставляет интерфейс на основе jupyter поверх ORM, который позволяет очищать / комментировать данные, отслеживать эксперименты по машинному обучению и выполнять задания по обучению - все в блокноте jupyter. ,
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
. Я попробовал внутри jupyter, а также добавил в settings.py. Но все же мой юпитер дает ошибку