Trong ứng dụng django tôi đang chạy tác vụ không đồng bộ và muốn hiển thị tiến trình, lỗi, v.v ... cho người dùng. Nếu có lỗi, người dùng phải được chuyển hướng đến trang có thêm đầu vào hoặc một số hành động cần thiết để khắc phục sự cố. Cách tốt nhất để giao tiếp từ công việc cần tây trở lại giao diện người dùng là gì?Nhân viên cần cẩu Django để gửi trạng thái thời gian thực và thông báo kết quả đến giao diện người dùng
Dưới đây là một cấu trúc cơ bản trong mã giả:
# views.py
from tasks import run_task
def view_task():
run_task.delay()
return render(request, 'template.html')
# tasks.py
from compute_module import compute_fct
@shared_task
def run_task():
result = compute_fct()
# how to catch status update messages from compute_module while compute_fct is running??
if result == 'error':
handle_error()
else:
handle_succes()
# compute_module
import pandas as pd
def compute_fct():
# send message: status = loading file
df = pd.read_csv('test.csv')
# send message: status = computing
val = df['col'].mean()
if val is None:
return {'status':'error'}
else:
return {'status':'success','val':val}
Những gì tôi tưởng muốn:
compute_module.py
Module này sử dụng python logger bản địa. Bằng cách tách các nhiệm vụ, tôi muốn giữ cho việc ghi nhật ký càng chung càng tốt và sử dụng các trình ghi chuẩn python/django. Nhưng chúng dường như không được thiết kế để gửi tin nhắn đến giao diện người dùng.- cần tây nhiệm vụ bằng cách nào đó xử lý các bản ghi và thay vì hiển thị chúng trên stdout chuyển hướng họ Pusher
- chương trình front-end js và xử lý các thông điệp
Có thể có cách tiêu chuẩn giao tiếp giữa người lao động cần tây và phía trước kết thúc mà tôi không biết. kịch bản này phải xảy ra thường xuyên và tôi ngạc nhiên vì nó rất khó thực hiện. theo cách mà hàng đợi thông báo thỏmq hoặc sns aws nên được thiết kế cho việc này. dưới đây là những tài nguyên mà tôi đã xem xét nhưng không cảm thấy một trong số chúng hoạt động rất tốt nhưng có lẽ tôi chỉ đang bối rối.
đăng nhập: đây có vẻ là thêm về cách đăng nhập vào phía máy chủ, không gửi tin nhắn đến người dùng
- http://docs.celeryproject.org/en/latest/userguide/tasks.html#logging
- https://docs.djangoproject.com/en/2.0/topics/logging/
- http://oddbird.net/2017/04/17/async-notifications/
- https://www.google.com/search?q=celery+worker+send+message+to+front+end
Cần tây cam có vẻ là về nhiệm vụ giám sát quản trị, không phải là sen thông điệp ding để sử dụng
đẩy tôi thích nhưng tôi không muốn có compute_module.py
đối phó với nó. Đó là Ví dụ tôi không muốn làm bất kỳ sự tích hợp pusher.com nào bên trong compute_module.py
. Đoán tôi có thể vượt qua một đối tượng pusher mà đã được khởi tạo nên các mô-đun chỉ có thể đẩy thông điệp nhưng một lần nữa tôi muốn nó được generic
- https://blog.pusher.com/improve-user-experience-app-real-time-progress-bar-tutorial/
- https://blog.pusher.com/django-pusherable/
những gì sẽ là một báo cáo vị trí tiến bộ trong trường hợp của bạn? bạn chạy một nhiệm vụ, nó được thực hiện hoặc nó lỗi. nếu bạn chạy một nhiệm vụ bị phân hủy thành các nhiệm vụ phụ, bạn có thể sử dụng một webworker để đẩy đầu ra cuối cùng của mỗi phụ trở lại máy khách không? tôi cũng không thực sự * cảm thấy * python đăng nhập như một cơ chế phản hồi người dùng - Tôi nghi ngờ nhận được * đẹp * đầu ra, đặc biệt cho html sẽ rắc rối hơn nó có giá trị. –