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 SynchronousOnlyOperation
excepció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 off
magia 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 .
fuente
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 errorPor 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 )fuente