Как использовать django 3.0 ORM в ноутбуке Jupyter без запуска проверки асинхронного контекста?

24

В 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. ,

michalwols
источник

Ответы:

18

Меня устраивает

os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"

Кстати, я запускаю свой ноутбук с помощью команды

./manage.py shell_plus --notebook

Надеюсь, поможет

Войтас Козей
источник
Я попробовал это. это все еще показывает ошибку в jupyter. Где я должен положить os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true". Я попробовал внутри jupyter, а также добавил в settings.py. Но все же мой юпитер дает ошибку
Сантош Йедиди
2
Я положил это в тетрадь
Войтас Козей
Ответ @michalwols сработал для меня
Сантош Йедиди
@SanthoshYedidi сделай это в кли. Экспортируйте переменную перед запуском сервера jupyter.
Сиддхарт Пант
работал для меня тоже. просто добавьте его в файл settings.py и запустите shell_plus на ноутбуке
Шехар
6

Сейчас я планирую просто использовать раздвоенную версию django с новой настройкой, чтобы пропустить проверку async_unsafe . Как только ORM получит асинхронную поддержку, мне, вероятно, придется переписать свой проект, чтобы поддержать его, и сбросить флаг.

РЕДАКТИРОВАТЬ: теперь есть PR, чтобы добавить переменную env ( DJANGO_ALLOW_ASYNC_UNSAFE), чтобы отключить проверку ( https://github.com/django/django/pull/12172 )

michalwols
источник
1
Это изменение теперь запланировано на 3.0.1
Sayse
Это решение сработало для меня. спасибо
Сантош Едиди