2012-06-22 36 views
24

Tôi đang tìm kiếm một đơn giản (tức là, không yêu cầu tôi thiết lập một máy chủ riêng để xử lý hàng đợi tin nhắn) một giao diện web nhỏ chạy các phép tính và tạo biểu đồ. Đây là những gì giao diện web của tôi cần phải làm:Hàng đợi không phải tin nhắn/Đơn giản bỏ phiếu dài bằng Python (và Flask)

  1. dùng yêu cầu một đồ thị/dữ liệu trong một giao diện web
  2. Server chạy một số tính toán.
  3. Trong khi máy chủ đang chạy tính toán, một vùng chứa nhỏ được cập nhật (có thể thông qua AJAX/jQuery) với tiến trình tính toán (tương tự như những gì bạn thực hiện trong một consol có in (tức là in 'tính toán mật độ hàm ...'))
  4. Kết thúc tính toán và biểu đồ được hiển thị cho người dùng.

Khi tính toán được thực hiện phía máy chủ, tôi không thực sự chắc chắn cách dễ dàng thiết lập điều này. Rõ ràng tôi sẽ muốn thiết lập một API REST để xử lý việc bỏ phiếu, điều này sẽ dễ dàng trong Flask. Tuy nhiên, tôi không chắc chắn làm thế nào để lấy các bản cập nhật thực tế. Một rõ ràng, mặc dù phức tạp cho mục đích này, giải pháp sẽ được thiết lập một hàng đợi tin nhắn và làm một số bỏ phiếu dài. Tuy nhiên, tôi không chắc chắn đây có phải là cách tiếp cận đúng cho một cái gì đó đơn giản này không.

Dưới đây là những câu hỏi của tôi:

  1. Có cách nào để làm điều này bằng cách sử dụng hệ thống tập tin? Hiệu suất không phải là một vấn đề lớn. AJAX/jQuery có thể tìm thư từ một tệp không? Lưu tiến trình vào một số tệp .json?
  2. Điều gì về tẩy? (Tôi không thực sự biết nhiều về việc tẩy, nhưng có lẽ tôi có thể chọn một thông điệp dict và nó có thể được đọc bởi một API đang xử lý việc bỏ phiếu).
  3. Đang bỏ phiếu ngay cả cách tiếp cận đúng? Có một mô hình tốt hơn hoặc phổ biến hơn để xử lý điều này?

Tôi có cảm giác tôi đang quá phức tạp vì tôi biết loại điều này phổ biến trên web. Khá thường xuyên tôi thấy những thứ xảy ra và một chút "loading.gif" hình ảnh đang chạy trong khi một số tính toán đang diễn ra (ví dụ, trong Google Analytics).

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

Trả lời

39

Tôi đã xây dựng một số ứng dụng như thế này bằng cách sử dụng Flask và jQuery. Dựa trên kinh nghiệm đó, tôi muốn nói kế hoạch của bạn là tốt.

  1. Không sử dụng hệ thống tệp. Bạn sẽ gặp phải các vấn đề bảo mật/bảo vệ JavaScript. Trong trường hợp không chắc bạn tìm thấy cách giải quyết hợp lý, bạn vẫn sẽ không có bất cứ điều gì xách tay hoặc khả năng mở rộng. Thay vào đó, hãy sử dụng một khung công tác phân phát web cục bộ nhỏ, như Flask.

  2. Không dưa. Sử dụng JSON. Đó là ngôn ngữ của các ứng dụng web và giao diện REST. jQuery và các plugin dựa trên jQuery đẹp mắt để vẽ biểu đồ, đồ thị và như vậy sẽ mong đợi JSON. Thật dễ sử dụng, có thể đọc được bằng con người và đối với các ứng dụng quy mô nhỏ, không có lý do gì để đi đến bất kỳ nơi nào khác.

  3. Việc bỏ phiếu dài là tốt cho những gì bạn muốn thực hiện. Ứng dụng dựa trên HTTP thuần túy có một số hạn chế. Và WebSockets và các lớp socket-ish tương tự như Socket.IO "là tương lai." Nhưng việc tìm kiếm các ví dụ đơn giản, tốt về việc triển khai phía máy chủ có, theo kinh nghiệm của tôi, rất khó khăn.Tôi đã nhìn chăm chú. Có rất nhiều ví dụ muốn bạn thiết lập Node.js, REDIS và các phần khác của phần mềm trung gian. Nhưng tại sao chúng ta phải thiết lập hai hoặc ba máy chủ trung gian riêng biệt? Thật lố bịch. Vì vậy, bỏ phiếu dài trên một khuôn khổ web đơn giản, tinh khiết-Python như Flask là con đường để đi IMO.

Mã này là hơn một chút so với một đoạn, vì vậy hơn bao gồm nó ở đây, tôi đã đặt một ví dụ đơn giản vào a Mercurial repository on bitbucket mà bạn có thể tự do xem xét, sao chép hoặc bản sao. Có ba phần:

  • serve.py một máy chủ Python/Flask dựa
  • templates/index.html 98% HTML, 2% mẫu nộp server Flask dựa trên sẽ làm dưới dạng HTML
  • static/lpoll.js một khách hàng jQuery dựa trên
+2

Ah, cảm ơn bạn * vì vậy * nhiều cho việc này! Tôi sẽ xem mã của bạn tối nay. "Nhưng việc tìm kiếm các ví dụ đơn giản, tốt về triển khai phía máy chủ có, theo kinh nghiệm của tôi, rất khó khăn". là trải nghiệm chính xác mà tôi có, vì vậy tôi rất vui khi biết rằng tôi không đơn độc. Cảm ơn một lần nữa !! – aaronlevin

+0

FYI Tôi đã thử điều này đầu tiên với bottle.py (với một kịch bản xử lý con dài) và có một số vấn đề chặn. Với Flask nó hoạt động rất tốt. Cảm ơn! – Nate

+0

Làm thế nào để đồng bộ hóa nhiều máy khách với tất cả nhận tín hiệu cùng một lúc? – r1d3h4rd

10

Việc bỏ phiếu dài là một công việc hợp lý trước khi hỗ trợ đơn giản, tự nhiên cho Web Sockets đến hầu hết các trình duyệt và trước khi nó được tích hợp dễ dàng cùng với các ứng dụng Flask. Nhưng ở đây vào giữa năm 2013, hỗ trợ Web Socket đã đi một chặng đường dài.

Here is an example, tương tự như hình trên, nhưng tích hợp Flask và Web Sockets. Nó chạy các thành phần trên máy chủ từ geventgevent-websocket.

Lưu ý ví dụ này không có ý định trở thành kiệt tác Web Socket. Nó giữ lại rất nhiều cấu trúc lpoll, để làm cho chúng dễ dàng so sánh hơn. Nhưng nó ngay lập tức cải thiện khả năng đáp ứng, chi phí máy chủ và tương tác của ứng dụng Web.

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