¿Cómo usar django 3.0 ORM en un Jupyter Notebook sin activar la verificación de contexto asíncrono?

24

Django 3.0 está agregando soporte asgi / async y con él una protección para hacer solicitudes sincrónicas en un contexto asincrónico . Al mismo tiempo, IPython acaba de agregar soporte asincrónico / en espera de nivel superior , que parece estar ejecutando toda la sesión de intérprete dentro de un bucle de eventos predeterminado.

Desafortunadamente, la combinación de estas dos grandes adiciones significa que cualquier operación de django ORM en un cuaderno jupyter causa una SynchronousOnlyOperationexcepción:

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

Como dice el mensaje de excepción, es posible ajustar cada llamada ORM de forma sync_to_async()similar:

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

pero no es muy conveniente, especialmente para campos relacionados que generalmente se resolverían implícitamente en la búsqueda de atributos.

(Intenté con la %autoawait offmagia pero no funcionó, de un vistazo rápido a los documentos, supongo que es porque los ipykernels siempre se ejecutan en un bucle asíncio)

Entonces, ¿hay alguna manera de desactivar la sincronización en la verificación de contexto asíncrono en django o ejecutar un ipykernel en un contexto síncrono?


Para el contexto: escribí un paquete de ciencia de datos que usa django como servidor de fondo pero también expone una interfaz basada en jupyter en la parte superior del ORM que le permite limpiar / anotar datos, rastrear experimentos de aprendizaje automático y ejecutar trabajos de capacitación, todo en un cuaderno jupyter .

michalwols
fuente

Respuestas:

18

Esto funciona para mi

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

Por cierto, comienzo mi cuaderno usando el comando

./manage.py shell_plus --notebook

Espero eso ayude

Wojtas Koziej
fuente
He intentado esto todavía muestra el error en jupyter. ¿Dónde debería poner os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"? Intenté dentro de jupyter y también agregué a settings.py. Pero aún así mi jupyter está dando error
Santhosh Yedidi
2
Lo puse en el cuaderno
Wojtas Koziej
La respuesta de @michalwols funcionó para mí
Santhosh Yedidi
@SanthoshYedidi hacerlo en el cli. Exporte la variable antes de ejecutar el servidor jupyter.
Siddharth Pant
Trabajó para mí también. simplemente agréguelo a settings.py y ejecute shell_plus en el cuaderno
Shekhar
6

Por ahora planeo usar una versión bifurcada de django con una nueva configuración para omitir la comprobación async_unsafe . Una vez que el ORM obtenga soporte asíncrono, probablemente tenga que volver a escribir mi proyecto para soportarlo y soltar la bandera.

EDITAR: ahora hay un RP para agregar una variable env ( DJANGO_ALLOW_ASYNC_UNSAFE) para deshabilitar la verificación ( https://github.com/django/django/pull/12172 )

michalwols
fuente
Este cambio ahora está programado para 3.0.1
Sayse
Esta solución funcionó para mí. gracias
Santhosh Yedidi