Wie verwende ich Django 3.0 ORM in einem Jupyter Notebook, ohne die asynchrone Kontextprüfung auszulösen?

24

Django 3.0 fügt Asgi / Async-Unterstützung hinzu und schützt damit synchrone Anforderungen in einem asynchronen Kontext . Gleichzeitig hat IPython gerade die asynchrone / wartende Unterstützung der obersten Ebene hinzugefügt , die anscheinend die gesamte Interpretersitzung innerhalb einer Standardereignisschleife ausführt.

Leider bedeutet die Kombination dieser beiden großartigen Zusätze, dass jede Django-ORM-Operation in einem Jupyter-Notebook eine SynchronousOnlyOperationAusnahme verursacht:

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

Wie in der Ausnahmemeldung angegeben, ist es möglich, jeden ORM-Aufruf sync_to_async()wie folgt zu verpacken :

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

Dies ist jedoch nicht sehr praktisch, insbesondere für verwandte Felder, die normalerweise bei der Attributsuche implizit aufgelöst werden.

(Ich habe %autoawait offMagie ausprobiert, aber es hat nicht funktioniert. Nach einem kurzen Blick auf die Dokumente gehe ich davon aus, dass ipykernels immer in einer Asyncio-Schleife ausgeführt werden.)

Gibt es also eine Möglichkeit, entweder die Synchronisierung in der asynchronen Kontextprüfung in Django zu deaktivieren oder einen Ipykernel in einem synchronen Kontext auszuführen?


Zum Kontext: Ich habe ein Data Science-Paket geschrieben, das Django als Backend-Server verwendet, aber auch eine auf Jupyter basierende Schnittstelle über dem ORM bereitstellt, mit der Sie Daten bereinigen / kommentieren, Experimente zum maschinellen Lernen verfolgen und Schulungsjobs in einem Jupyter-Notizbuch ausführen können .

michalwols
quelle

Antworten:

18

Für mich geht das

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

Übrigens starte ich mein Notizbuch mit dem Befehl

./manage.py shell_plus --notebook

Ich hoffe es hilft

Wojtas Koziej
quelle
Ich habe es versucht. es zeigt immer noch den Fehler in jupyter. Wo sollte ich os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true". Ich habe es in jupyter versucht und auch zu settings.py hinzugefügt. Aber immer noch gibt mein Jupiter Fehler
Santhosh Yedidi
2
Ich habe es in ein Notizbuch geschrieben
Wojtas Koziej
@michalwols Antwort hat bei mir funktioniert
Santhosh Yedidi
@ SanthoshYedidi mach es im Cli. Exportieren Sie die Variable, bevor Sie den Jupyter-Server ausführen.
Siddharth Pant
arbeitete auch für mich. Fügen Sie es einfach der settings.py hinzu und führen Sie shell_plus auf dem Notebook aus
Shekhar
6

Im Moment habe ich vor, nur eine gegabelte Version von Django mit einer neuen Einstellung zu verwenden, um die Prüfung async_unsafe zu überspringen . Sobald der ORM asynchrone Unterstützung erhält, muss ich wahrscheinlich mein Projekt neu schreiben, um es zu unterstützen und das Flag zu löschen.

BEARBEITEN: Es gibt jetzt eine PR, um eine env-Variable ( DJANGO_ALLOW_ASYNC_UNSAFE) hinzuzufügen , um die Prüfung zu deaktivieren ( https://github.com/django/django/pull/12172 ).

michalwols
quelle
Diese Änderung ist jetzt für 3.0.1
Sayse
Diese Lösung hat bei mir funktioniert. danke
Santhosh Yedidi