非同期コンテキストチェックをトリガーせずに、Jupyter Notebookでdjango 3.0 ORMを使用する方法


24

Django 3.0はasgi / asyncのサポートを追加しており、非同期コンテキストで同期リクエストを行うことを防いでいます。同時に、IPythonは最上位の非同期/待機サポートを追加しました。これは、デフォルトのイベントループ内でインタープリターセッション全体を実行しているようです。

残念ながら、これら2つの優れた追加の組み合わせは、jupyterノートブックでのdjango 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魔法を試しましたが、それは機能しませんでした、私が想定しているドキュメントを一目見ただけでそれはipykernelが常に非同期ループで実行されるためです)

それで、djangoの非同期コンテキストチェックで同期を無効にするか、同期コンテキストでipykernelを実行する方法はありますか?


コンテキスト:私はdjangoをバックエンドサーバーとして使用するデータサイエンスパッケージを作成しましたが、ORMの上にjupyterベースのインターフェイスを公開し、データのクリーンアップ/注釈付け、機械学習実験の追跡、トレーニングジョブの実行をすべてjupyterノートブックで実行できるようにしました。

回答:


18

わたしにはできる

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

ところで、私はコマンドを使用してノートブックを起動します

./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はCLIでそれを行います。jupyterサーバーを実行する前に変数をエクスポートします。
Siddharthパンツ

私も働いた。それをsettings.pyに追加して、ノートブックでshell_plusを実行するだけ
Shekhar

6

今のところ、フォークしたバージョンのdjangoを使用して、新しい設定でasync_unsafeチェックをスキップすることを計画しています。ORMが非同期サポートを取得したら、おそらくそれをサポートするようにプロジェクトを書き直して、フラグをドロップする必要があります。

編集:DJANGO_ALLOW_ASYNC_UNSAFEチェックを無効にするために環境変数()を追加するPRがありますhttps://github.com/django/django/pull/12172


この変更は現在3.0.1に
Sayse

この解決策は私にとってうまくいきました。ありがとう
Santhosh Yedidi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.