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, який дозволяє очищати / коментувати дані, відстежувати експерименти машинного навчання та виконувати навчальні завдання все в зошиті з юпітера .
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
. Я спробував всередині jupyter, а також додав до settings.py. Але поки мій юпітер помиляється