Come utilizzare django 3.0 ORM in un notebook Jupyter senza attivare il controllo del contesto asincrono?


24

Django 3.0 sta aggiungendo il supporto asgi / async e con esso una guardia per fare richieste sincrone in un contesto asincrono . Allo stesso tempo, IPython ha appena aggiunto il supporto asincrono / attende di massimo livello , che sembra eseguire l'intera sessione dell'interprete all'interno di un ciclo di eventi predefinito.

Sfortunatamente la combinazione di queste due grandi aggiunte significa che qualsiasi operazione django ORM in un notebook jupyter provoca SynchronousOnlyOperationun'eccezione:

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

Come dice il messaggio di eccezione, è possibile racchiudere ogni chiamata ORM in un modo sync_to_async()simile:

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

ma non è molto conveniente, specialmente per i campi correlati che di solito sarebbero risolti implicitamente nella ricerca degli attributi.

(Ho provato la %autoawait offmagia ma non ha funzionato, da una rapida occhiata ai documenti presumo sia perché gli ipykernels corrono sempre in un ciclo asincrono)

Quindi c'è un modo per disabilitare la sincronizzazione nel controllo del contesto asincrono in django o eseguire un ipykernel in un contesto sincrono?


Per il contesto: ho scritto un pacchetto di data science che utilizza django come server back-end ma espone anche un'interfaccia basata su jupyter in cima all'ORM che consente di pulire / annotare i dati, tenere traccia degli esperimenti di machine learning ed eseguire lavori di formazione in un notebook jupyter .

Risposte:


18

Per me funziona

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

A proposito, avvio il mio notebook usando il comando

./manage.py shell_plus --notebook

Spero che sia d'aiuto


Ci ho provato mostra ancora l'errore in jupyter. Dove dovrei mettere os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true". Ho provato dentro jupyter e ho anche aggiunto a settings.py. Ma il mio ragazzo sta ancora dando errore
Santhosh Yedidi,

2
L'ho messo nel quaderno
Wojtas Koziej il

La risposta di @michalwols ha funzionato per me
Santhosh Yedidi

@SanthoshYedidi fallo nel cli. Esporta la variabile prima di eseguire il server jupyter.
Siddharth Pant

ha funzionato anche per me. aggiungilo a settings.py ed esegui shell_plus su notebook
Shekhar

6

Per ora ho intenzione di usare solo una versione biforcuta di Django con una nuova impostazione per saltare il controllo async_unsafe . Una volta che l'ORM ottiene il supporto asincrono, probabilmente dovrò riscrivere il mio progetto per supportarlo e rilasciare la bandiera.

EDIT: ora c'è un PR per aggiungere una variabile env ( DJANGO_ALLOW_ASYNC_UNSAFE) per disabilitare il controllo ( https://github.com/django/django/pull/12172 )


Questa modifica è ora prevista per 3.0.1
Sayse

Questa soluzione ha funzionato per me. grazie
Santhosh Yedidi il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.