Jak korzystać z Django 3.0 ORM w Notatniku Jupyter bez uruchamiania sprawdzania kontekstu asynchronicznego?

24

Django 3.0 dodaje obsługę asgi / async, a wraz z nią pilnuje wykonywania synchronicznych żądań w kontekście asynchronicznym . Jednocześnie IPython dodał właśnie obsługę asynchronizacji / oczekiwania na najwyższy poziom , która wydaje się uruchamiać całą sesję interpretera w domyślnej pętli zdarzeń.

Niestety połączenie tych dwóch wspaniałych dodatków oznacza, że ​​każda operacja ORM django w notatniku jupyter powoduje SynchronousOnlyOperationwyjątek:

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

Jak mówi komunikat wyjątku, możliwe jest zawinięcie każdego wywołania ORM w sync_to_async()podobny sposób:

images = await sync_to_async(Image.objects.all)()

ale nie jest to zbyt wygodne, szczególnie w przypadku powiązanych pól, które zwykle byłyby domyślnie rozwiązane podczas wyszukiwania atrybutów.

(Próbowałem %autoawait offmagii, ale to nie zadziałało, od szybkiego spojrzenia na dokumenty, które zakładam, ponieważ ipykernels zawsze działa w pętli asyncio)

Czy jest więc sposób na wyłączenie synchronizacji w asynchronicznym sprawdzaniu kontekstu w django lub uruchomienie ipykernel w kontekście synchronicznym?


Dla kontekstu: napisałem pakiet do nauki danych, który wykorzystuje django jako serwer zaplecza, ale także udostępnia interfejs oparty na jupyter na ORM, który pozwala na czyszczenie / adnotacje danych, śledzenie eksperymentów uczenia maszynowego i uruchamianie zadań szkoleniowych w notatniku jupyter .

michalwols
źródło

Odpowiedzi:

18

Mi to pasuje

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

BTW, uruchamiam notebooka za pomocą polecenia

./manage.py shell_plus --notebook

Mam nadzieję, że to pomoże

Wojtas Koziej
źródło
Próbowałem tego. nadal pokazuje błąd w jupyter. Gdzie powinienem położyć os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true". Próbowałem wewnątrz jupyter i również dodałem do settings.py. Ale nadal mój jupter daje błąd
Santhosh Yedidi
2
Umieściłem go w zeszycie
Wojtas Koziej
@michalwols odpowiedź zadziałała dla mnie
Santhosh Yedidi
@SanthoshYedidi zrób to w Cli. Wyeksportuj zmienną przed uruchomieniem serwera jupyter.
Siddharth Pant
też dla mnie pracował. po prostu dodaj go do settings.py i uruchom shell_plus na notebooku
Shekhar
6

Na razie planuję po prostu użyć rozwidlonej wersji django z nowym ustawieniem, aby pominąć sprawdzanie async_unsafe . Gdy ORM uzyska wsparcie asynchroniczne, prawdopodobnie będę musiał przepisać mój projekt, aby go obsługiwać i upuścić flagę.

EDYCJA: teraz jest PR, aby dodać zmienną env ( DJANGO_ALLOW_ASYNC_UNSAFE), aby wyłączyć sprawdzanie ( https://github.com/django/django/pull/12172 )

michalwols
źródło
Ta zmiana jest teraz zaplanowana na 3.0.1
Sayse
To rozwiązanie działało dla mnie. dzięki
Santhosh Yedidi