2012-02-29 18 views
6

Tôi đang phát triển máy chủ web django mà trên đó một máy khác (có IP đã biết) có thể tải lên bảng tính tới máy chủ web của tôi. Sau khi bảng tính đã được cập nhật, tôi muốn kích hoạt một số quá trình xử lý/xác nhận/phân tích trên bảng tính (có thể mất> 5 phút --- quá lâu để máy chủ khác chờ phản hồi hợp lý) và sau đó gửi máy (với một IP đã biết) một HttpResponse chỉ ra rằng việc xử lý dữ liệu đã hoàn tất.chức năng kích hoạt sau khi trả lại HttpResponse từ chế độ xem django

Tôi nhận ra rằng bạn không thể làm processing.data() sau khi trở về một HttpResponse, nhưng chức năng tôi muốn mã mà trông giống như sau:

# processing.py 
def spreadsheet(*args, **kwargs): 
    print "[robot voice] processing spreadsheet........." 
    views.finished_processing_spreadsheet() 

# views.py 
def upload_spreadsheet(request): 
    print "save the spreadsheet somewhere" 
    return HttpResponse("started processing spreadsheet") 
    processing.data() 

def finished_processing_spreadsheet(): 
    print "send good news to other server (with known IP)" 

tôi biết làm thế nào để viết từng chức năng riêng, nhưng làm thế nào tôi có thể có hiệu quả hãy gọi processing.data()sauviews.upload_spreadsheet đã trả lại câu trả lời?

Tôi đã thử sử dụng django's request_finished signaling framework nhưng điều này không kích hoạt phương thức processing.spreadsheet() sau khi trả lại HttpResponse. Tôi đã thử sử dụng một trang trí trên views.upload_spreadsheet với cùng một vấn đề.

Tôi có một ý tưởng rằng việc này có thể liên quan đến việc viết middleware hoặc có thể là custom class-based view, tôi không có bất kỳ kinh nghiệm nào vì vậy tôi nghĩ tôi sẽ đặt câu hỏi cho vũ trụ để tìm kiếm trợ giúp.

Cảm ơn sự giúp đỡ của bạn!

Trả lời

4

Thực tế, Django có mô hình đồng bộ. Nếu bạn muốn thực hiện xử lý async thực, bạn cần một hàng đợi tin nhắn. Việc sử dụng nhiều nhất với django là cần tây, nó có thể trông hơi "overkill" nhưng đó là một câu trả lời tốt.

Tại sao chúng ta cần điều này? bởi vì trong một ứng dụng wsgi, apache đưa ra yêu cầu cho tệp thực thi và, tệp thực thi trả về văn bản. Đó là chỉ một lần khi thực thi kết thúc thực hiện của mình mà apache xác nhận sự kết thúc của yêu cầu.

+0

Cảm ơn bạn đã giải thích lý do tại sao điều này là cần thiết, Cristophe. Dựa trên lời giải thích của bạn và jpic, tôi nghĩ tôi sẽ kiểm tra cần tây sau khi ngủ nhiều hơn một chút. – dino

3

Vấn đề với việc triển khai của bạn là nếu số lượng bảng tính đang xử lý bằng số lượng công nhân: trang web của bạn sẽ không phản hồi nữa.

Bạn nên sử dụng một nhiệm vụ hàng đợi nền, về cơ bản có 2 quá trình: máy chủ của bạn và công việc quản lý nền. Máy chủ cần ủy quyền xử lý bảng tính cho trình quản lý tác vụ nền. Khi tác vụ nền được thực hiện, nó sẽ thông báo cho máy chủ bằng cách nào đó. Ví dụ, nó có thể làm model_with_spreadsheet.processed = datetime.datetime.now().

Bạn nên sử dụng một người quản lý nền công việc như django-ztask (rất dễ dàng thiết lập), celery (rất mạnh mẽ, có lẽ quá mức cần thiết trong trường hợp của bạn) hoặc thậm chí uwsgi spooler (mà rõ ràng đòi hỏi việc triển khai uwsgi).

+0

Cảm ơn bạn đã phản hồi nhanh. Dựa trên câu trả lời của bạn và của christophe31, tôi nghĩ tôi sẽ kiểm tra cần tây sau khi ngủ nhiều hơn một chút. – dino

+0

đóng câu hỏi xin vui lòng – jpic

Các vấn đề liên quan