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 SynchronousOnlyOperation
un'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 off
magia 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 .
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