Como usar o django 3.0 ORM em um notebook Jupyter sem disparar a verificação de contexto assíncrona?

24

O Django 3.0 está adicionando suporte ao asgi / async e, com ele, guarda solicitações síncronas em um contexto assíncrono . Simultaneamente, o IPython acabou de adicionar suporte a nível assíncrono / aguardado , que parece estar executando toda a sessão do intérprete dentro de um loop de eventos padrão.

Infelizmente, a combinação desses dois grandes acréscimos significa que qualquer operação django ORM em um notebook jupyter causa uma SynchronousOnlyOperationexceção:

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

Como a mensagem de exceção diz, é possível agrupar cada chamada ORM da seguinte maneira sync_to_async():

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

mas não é muito conveniente, especialmente para campos relacionados que normalmente seriam resolvidos implicitamente na pesquisa de atributos.

(Tentei %autoawait offmagia, mas não funcionou; de uma rápida olhada nos documentos , presumo que seja porque os ipykernels sempre rodam em um loop assíncrono)

Portanto, existe uma maneira de desativar a sincronização no contexto assíncrono no django ou executar um ipykernel em um contexto síncrono?


Por contexto: escrevi um pacote de ciência de dados que usa o django como servidor back-end, mas também expõe uma interface baseada em jupyter na parte superior do ORM, que permite limpar / anotar dados, rastrear experimentos de aprendizado de máquina e executar trabalhos de treinamento em um notebook jupyter .

michalwols
fonte

Respostas:

18

Funciona para mim

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

BTW, inicio meu notebook usando o comando

./manage.py shell_plus --notebook

Espero que ajude

Wojtas Koziej
fonte
Eu tentei isso. ainda mostra o erro no jupyter. Onde devo colocar os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true". Eu tentei dentro do jupyter e também adicionei ao settings.py. Ainda meu jupyter está dando erro
Santhosh Yedidi
2
Coloquei no caderno
Wojtas Koziej
@michalwols resposta funcionou para mim
Santhosh Yedidi
@SanthoshYedidi faz isso no cli. Exporte a variável antes de executar o servidor jupyter.
Siddharth Pant
trabalhou para mim também. basta adicioná-lo ao settings.py e executar o shell_plus no notebook
Shekhar
6

Por enquanto, planejo usar apenas uma versão bifurcada do django com uma nova configuração para ignorar a verificação async_unsafe . Quando o ORM obtiver suporte assíncrono, provavelmente terei que reescrever meu projeto para apoiá-lo e soltar a bandeira.

EDIT: agora existe um PR para adicionar uma variável env ( DJANGO_ALLOW_ASYNC_UNSAFE) para desativar a verificação ( https://github.com/django/django/pull/12172 )

michalwols
fonte
Esta alteração está agendada para 3.0.1
Sayse 12/12/19
Esta solução funcionou para mim. obrigado
Santhosh Yedidi