2011-07-14 44 views
5

Tôi đang sử dụng một loại bỏ phiếu dài trong ứng dụng Django của mình để trả lại thông điệp trạng thái về hoạt động lâu dài cho khách hàng khi nó tiến triển. Tôi làm điều này bằng cách trả về một đối tượng HttpResponse trong hàm xem của tôi được khởi tạo với một trình lặp mà trả về các chuỗi. Điều này tất cả các công trình lớn, nhưng chức năng iterator là nhận được khá dài với tấn sản lượng để trả lại thông điệp trạng thái.Bỏ phiếu dài ở Django

Tôi muốn kiến ​​trúc sư này tốt hơn bằng cách chia hoạt động dài thành nhiều chức năng, mỗi chức năng sẽ trả về các thông điệp trạng thái của riêng nó. Nhưng tôi không thể nhìn thấy một cách để làm điều này. Nói cách khác, tôi có điều này:

def my_long_operation(): 
    do_something() 
    yield "Did something" 
    do_something_else() 
    yield "Did something else" 

... và tôi muốn có:

def do_something(): 
    do_first_part_of_something() 
    yield "Did first part of something" 
    do_second_part_of_something() 
    yield "Did second party of something" 

def do_something_else(): 
    do_first_part_of_something_else() 
    yield "Did first part of something else" 
    do_second_part_of_something_else() 
    yield "Did second party of something else" 

def my_long_operation(): 
    do_something() 
    do_something_else() 

Có một số cách để có được sản lượng trong ví dụ thứ hai để mang lại giá trị cho người gọi của iterator? Nếu không, có cách tiếp cận tốt hơn không? Tôi nhìn vào WebSockets nhưng nó dường như không được nướng hoàn toàn (đặc biệt là về hỗ trợ trình duyệt). Tôi cũng coi cuộc thăm dò ý kiến ​​thực sự của máy chủ nhưng điều đó sẽ phức tạp hơn nhiều, vì vậy tôi muốn tiếp tục duy trì kết nối mở và thông điệp luồng nếu có thể.

+0

buộc tôi .. nhưng làm thế nào để bạn mong đợi để sử dụng này và để làm việc này? – arustgi

+0

Tóm lại, tôi tạo đối tượng phản hồi bằng cách sử dụng HttpResponse (my_long_operation(), mimetype = "text/plain") và trong mẫu HTML tôi đính kèm một trình nghe readyStateChange vào yêu cầu và cập nhật HTML với dữ liệu mới bất cứ khi nào trạng thái sẵn sàng thay đổi . –

+0

FWIW, IMHO bỏ phiếu dài có thể là một nỗi đau để thực hiện. Có một số kịch bản của nơi mà nó là mong muốn nhưng thường xuyên hơn không, trả lại một Id duy nhất immedtiately và cung cấp một url để thăm dò ý kiến ​​cho tình trạng đơn giản hơn rất nhiều để thực hiện. Điều này là tuyệt vời nếu bạn đang sử dụng một Db hoặc singleton để bảo tồn nhà nước. Tất nhiên, có những tình huống mà việc bỏ phiếu dài là cơ chế hoàn hảo, vì vậy đừng coi đây là phúc âm – Basic

Trả lời

3

Hãy thử:

import itertools 

def my_long_operation(): 
    return itertools.chain(do_something(), do_something_else()) 
Các vấn đề liên quan