2012-02-28 37 views
13

Tôi đã tự hỏi làm thế nào để tạo một django webservice (đáp ứng với XML) với websockets. Tôi đã có dịch vụ web django chấp nhận yêu cầu xml, phân tích cú pháp các yêu cầu đó, tạo truy vấn cơ sở dữ liệu, tạo phản hồi xml và gửi xml đó trở lại trình yêu cầu/trình duyệt. Chỉ cần một yêu cầu HTTP XML bình thường, nơi phản hồi được hiển thị dưới dạng xml trong trình duyệt.WebSocket + Django python WebService

Nhưng bây giờ tôi sẽ tạo websocket django webservice như thế nào? Cho phép nói rằng tôi muốn gửi một phản ứng xml cho người yêu cầu/trình duyệt với dữ liệu mới nhất từ ​​cơ sở dữ liệu bất cứ khi nào một sự kiện ma thuật mới xảy ra.

Tôi đã đọc rất nhiều bài đăng và blog nhưng tất cả đều quá chung chung. Tôi có thể giải quyết điều này chỉ với django + apache hoặc làm tôi cần cái gì khác bên cạnh django và máy chủ khác chỉ để xử lý websockets?

Tôi hiện đang sử dụng django 1.3, Apache + wsgi nhưng tôi sẽ sẵn sàng chuyển đổi bất kỳ cấu hình nào có thể hoạt động.

Cập nhật:

Có rất nhiều WebSockets thể ra khỏi đó, http://pypi.python.org/pypi?:action=search&term=websocket&submit=search nhưng mà người ta có thể được sử dụng trong trường hợp của tôi?

Trả lời

8

Xin lỗi nhưng django xử lý yêu cầu không đồng bộ rất rất kém vì đó là wsgi. Bạn sẽ bị giới hạn bởi số lượng cá thể song song của mình nếu bạn phải xử lý người dùng thực. Giải pháp tốt nhất là sử dụng lốc xoáy hoặc node.js.

Tornado xử lý websocket và bỏ phiếu dài rực rỡ. Dưới đây là wrapper của tôi để cho phép nhận người dùng và phiên từ một sợi cơn lốc xoáy song song:

https://gist.github.com/1939836

Nó chuyển thể từ một nguồn phức tạp hơn, tôi đã không được thử nghiệm ý chính này, đó là bỏ phiếu dài nhưng cơn lốc xoáy handlse WebSocket cũng .

http://www.tornadoweb.org/documentation/websocket.html

update:

Tránh django-WebSocket để sử dụng sản xuất. Ngay cả các nhà phát triển chính đề nghị chống lại nó.

Tôi khuyên bạn nên dùng Tornado vì đó là một công nghệ tuyệt vời nhanh hơn/nhẹ hơn django. Nó có thể hữu ích cho một số trường hợp đơn giản. Bạn sẽ cần phải cấu hình apache/nginx dù sao, ít nhất có được "nhanh hơn các trang web" tính năng có sẵn.

Thông báo Django-Desktop tập trung vào trình duyệt chrome và yêu cầu node.js.

cập nhật (01/2016):

Mozilla đưa tiền để django vào cuối năm 2015 để giải quyết vấn đề cụ thể này, việc thực hiện promizing nhất hiện nay thực hiện bởi một dev django lõi là này một:

https://github.com/andrewgodwin/channels

nó có thể sẽ là một phần của django 1.11 hoặc 2.0

+0

thx cho câu trả lời của bạn. Tôi phải tránh mọi chi phí ** bỏ phiếu **. Khách hàng không được yêu cầu Server để cập nhật mới. Tôi sẽ cập nhật bài đăng đầu tiên của mình với danh sách "triển khai có thể có hiện có" nhưng tôi không chắc chắn một trong số chúng có thể được sử dụng cho trường hợp của tôi. – Gero

+0

bỏ phiếu dài là đúng RealTime, bạn chỉ cần gửi câu trả lời khi cần. Nhưng bạn có tất cả những gì bạn cần để liên lạc giữa máy chủ async lốc xoáy và django. Tránh truy cập DB từ lốc xoáy nếu bạn sử dụng django orm, nó được thực hiện chặn cuộc gọi. – christophe31

+0

Tôi vừa đọc rfc để bỏ phiếu dài, nhưng tôi sẽ phải đi với WebSockets. Cần một trong nhiều triển khai, đó là capeable làm việc với django – Gero

0

Yeah, django không phải là tất cả những gì tuyệt vời khi nói đến chất liệu không đồng bộ.Lời khuyên của tôi cho bạn sẽ là sử dụng xoắn vì nó có rất nhiều thư viện websocket. Nếu bạn thực sự cần phải sử dụng django .. bạn có thể làm cho django hành động chỉ là một vượt qua, cho tất cả các công cụ api bạn xây dựng bằng cách sử dụng xoắn.

7

Mặc dù hơi phức tạp để thiết lập (nhưng có thể là cách để đi), bạn có thể sử dụng gunicorn + gevent + socket.io.

Tôi đã sử dụng this article để hướng dẫn theo cách của mình.

Bạn cũng có thể xem các sự kiện được gửi trên máy chủ (bài viết được đề cập ở trên cũng xem xét sự kiện đó). Nếu chúng phù hợp với nhu cầu của bạn, nó sẽ dễ cài đặt hơn một chút - vì bạn không phải thiết lập socket.io và bạn không cần thư viện máy khách. Mặc dù vậy, SSE không được hỗ trợ trong IE.