Як використовувати django 3.0 ORM в Jupyter Notebook, не запускаючи перевірку контексту async?


24

Django 3.0 додає підтримку asgi / async і разом із цим охороняє робити синхронні запити в контексті async . Одночасно IPython просто додав підтримку асинхрон / очікування верхнього рівня , яка, здається, запускає весь сеанс інтерпретації всередині циклу подій за замовчуванням.

На жаль, поєднання цих двох чудових доповнень означає, що будь-яка операція з джанго ORM у зошиті з юпітером викликає 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магію, але це не вийшло. Швидкий погляд на документи я припускаю, що це тому, що ipykernel завжди працює в циклі асинціо)

Отже, чи є спосіб відключити перевірку контексту асинхронізації в django або запустити ipykernel у синхронному контексті?


Для контексту: я написав пакет даних про дані, який використовує django як бекенд-сервер, але також відкриває інтерфейс на основі юпітеру поверх ORM, який дозволяє очищати / коментувати дані, відстежувати експерименти машинного навчання та виконувати навчальні завдання все в зошиті з юпітера .

Відповіді:


18

Це працює для мене

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

До речі, я запускаю свій ноутбук за допомогою команди

./manage.py shell_plus --notebook

Сподіваюся, це допомагає


Я спробував це. вона все ще показує помилку в джуптері. Куди мені поставити os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true". Я спробував всередині jupyter, а також додав до settings.py. Але поки мій юпітер помиляється
Сантош Єдіді,

2
Я помістив його в блокнот
Войтас Козій

Відповідь @michalwols працювала на мене
Santhosh Yedidi

@SanthoshYedidi зроби це в кліпі. Експортуйте змінну перед запуском сервера юпітера.
Сіддхарт Пант

працював і для мене. просто додайте його в settings.py та запустіть shell_plus на ноутбуці
Shekhar

6

Поки що я планую просто використовувати роздвоєну версію django з новим налаштуванням, щоб пропустити перевірку async_unsafe . Як тільки ORM отримає підтримку для асинхронізації, я, мабуть, доведеться переписати свій проект, щоб підтримати його та скинути прапор.

EDIT: тепер є PR, щоб додати змінну env ( DJANGO_ALLOW_ASYNC_UNSAFE), щоб відключити чек ( https://github.com/django/django/pull/12172 )


Зараз ця зміна запланована на 3.0.1
Sayse

Це рішення спрацювало на мене. дякую
Сантош Єдіді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.