비동기 컨텍스트 확인을 트리거하지 않고 Jupyter Notebook에서 django 3.0 ORM을 사용하는 방법은 무엇입니까?


24

Django 3.0은 asgi / async 지원 기능을 추가 하고 비동기식 컨텍스트에서 동기식 요청을하는 것을 막고 있습니다. 동시에 IPython은 최상위 이벤트 async / await support를 추가 하여 기본 이벤트 루프 내에서 전체 인터프리터 세션을 실행하는 것으로 보입니다.

불행히도이 두 가지 추가 기능의 조합은 jupyter 노트북에서 장고 ORM 작업이 SynchronousOnlyOperation예외를 발생 시킨다는 것을 의미합니다 .

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

예외 메시지에서 알 수 있듯이 각 ORM 호출을 다음 sync_to_async()과 같이 랩핑 할 수 있습니다.

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

그러나 일반적으로 속성 조회에서 암시 적으로 해결되는 관련 필드의 경우 매우 편리하지 않습니다.

(나는 %autoawait off마술을 시도 했지만 ipykernels가 항상 asyncio 루프에서 실행되기 때문에 내가 생각 하는 문서를 한 눈에 볼 때 작동하지 않았다 )

django에서 비동기 컨텍스트 검사에서 동기화를 비활성화하거나 동기 컨텍스트에서 ipykernel을 실행하는 방법이 있습니까?


컨텍스트 : django를 백엔드 서버로 사용하는 데이터 과학 패키지를 작성했지만 ORM 위에 Jupyter 기반 인터페이스를 노출하여 데이터를 정리 / 주석 처리하고 기계 학습 실험을 추적하며 Jupyter 노트북에서 교육 작업을 모두 실행할 수 있습니다 .

답변:


18

그것은 나를 위해 작동

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

BTW, 나는 명령을 사용하여 노트북을 시작합니다

./manage.py shell_plus --notebook

그것이 도움이되기를 바랍니다.


나는 이것을 시도했다. 여전히 jupyter에 오류가 표시됩니다. 어디에 두어야합니까 os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true". jupyter 내부에서 시도하고 settings.py에 추가했습니다. 그래도 내 jupyter는 오류가 발생합니다
Santhosh Yedidi

2
노트북에 넣었습니다
Wojtas Koziej

@michalwols 답변이 나를 위해 일했습니다
Santhosh Yedidi

@SanthoshYedidi는 병원에서 해. jupyter 서버를 실행하기 전에 변수를 내보내십시오.
Siddharth Pant

나도 일했다. settings.py에 추가하고 노트북에서 shell_plus를 실행하십시오
Shekhar

6

지금 은 async_unsafe 검사를 건너 뛰기 위해 새 설정으로 분기 버전의 django를 사용할 계획입니다 . ORM이 비동기 지원을 받으면 프로젝트를 지원하고 플래그를 삭제하기 위해 프로젝트를 다시 작성해야 할 것입니다.

편집 : 이제 DJANGO_ALLOW_ASYNC_UNSAFE검사를 비활성화하기 위해 env 변수 ( )를 추가하는 PR이 있습니다 ( https://github.com/django/django/pull/12172 )


이 변경 사항은 이제 3.0.1로
Sayse

이 솔루션은 저에게 효과적이었습니다. 감사합니다
Santhosh Yedidi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.