Làm cách nào để sử dụng django 3.0 ORM trong Notebook Jupyter mà không kích hoạt kiểm tra bối cảnh không đồng bộ?


24

Django 3.0 đang bổ sung hỗ trợ asgi / async và bảo vệ xung quanh việc thực hiện các yêu cầu đồng bộ trong ngữ cảnh không đồng bộ . Đồng thời, IPython chỉ cần thêm hỗ trợ async / await cấp cao nhất , dường như đang chạy toàn bộ phiên thông dịch bên trong một vòng lặp sự kiện mặc định.

Thật không may, sự kết hợp của hai bổ sung tuyệt vời này có nghĩa là bất kỳ thao tác ORM django nào trong máy tính xách tay jupyter đều gây ra SynchronousOnlyOperationngoại lệ:

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

Như thông báo ngoại lệ nói, có thể gói từng cuộc gọi ORM theo cách sync_to_async()như sau:

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

nhưng nó không thuận tiện lắm, đặc biệt là đối với các trường liên quan thường được giải quyết ngầm khi tra cứu thuộc tính.

(Tôi đã thử dùng %autoawait offphép thuật nhưng nó không hoạt động, từ cái nhìn thoáng qua vào các tài liệu tôi cho rằng đó là vì ipykernels luôn chạy trong một vòng lặp asyncio)

Vậy có cách nào để vô hiệu hóa đồng bộ hóa trong kiểm tra ngữ cảnh async trong django hoặc chạy ipykernel trong ngữ cảnh đồng bộ không?


Đối với ngữ cảnh: Tôi đã viết gói khoa học dữ liệu sử dụng django làm máy chủ phụ trợ nhưng cũng hiển thị giao diện dựa trên jupyter trên ORM cho phép bạn dọn dẹp / chú thích dữ liệu, theo dõi các thí nghiệm học máy và chạy tất cả các công việc đào tạo trong máy tính xách tay jupyter .

Câu trả lời:


18

Nó làm việc cho tôi

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

BTW, tôi khởi động máy tính xách tay của mình bằng lệnh

./manage.py shell_plus --notebook

Hy vọng nó giúp


Tôi đã thử điều này. nó vẫn hiển thị lỗi trong jupyter. Tôi nên đặt ở đâu os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true". Tôi đã thử bên trong jupyter và cũng được thêm vào settings.txt. BUt vẫn jupyter của tôi đang đưa ra lỗi
Santhosh Yedidi

2
Tôi đặt nó vào máy tính xách tay
Wojtas Koziej

Câu trả lời @michalwols làm việc cho tôi
Santhosh Yedidi

@SanthoshYedidi làm điều đó trong cli. Xuất biến trước khi chạy máy chủ jupyter.
Siddharth Pant

làm việc cho tôi quá chỉ cần thêm nó vào settings.txt và chạy shell_plus trên notebook
Shekhar

6

Hiện tại tôi có kế hoạch chỉ sử dụng một phiên bản ngã ba của django với một cài đặt mới để bỏ qua kiểm tra async_unsafe . Khi ORM được hỗ trợ không đồng bộ, có lẽ tôi sẽ phải viết lại dự án của mình để hỗ trợ và thả cờ.

EDIT: hiện có PR để thêm biến env ( DJANGO_ALLOW_ASYNC_UNSAFE) để vô hiệu hóa kiểm tra ( https://github.com/django/django/pull/12172 )


Thay đổi này hiện được lên kế hoạch cho 3.0.1
Sayse

Giải pháp này đã làm việc cho tôi. cảm ơn
Santhosh Yedidi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.