2010-11-16 85 views
41

Có cách nào để sử dụng Socket.IO http://socket.io/ với Django?Tôi có thể sử dụng Socket.IO với Django không?

+2

Bạn không là rất cụ thể. Câu trả lời cơ bản là "không", vì socket.io là một chương trình Node.js có hỗ trợ đa trình duyệt. Mặt khác, hoàn toàn có thể gửi các sự kiện từ Django đến máy chủ Socket.io qua kênh cục bộ và hoàn toàn có thể sửa đổi các hàng trong bảng từ Socket.io qua DBSlayer để thông báo cho Django về các thay đổi và thậm chí có thể cho cả hai để lại dấu vết trong máy khách để giao tiếp trạng thái giữa cả ba. Nhưng bạn đang cố gắng làm gì? –

+2

Tôi đang yêu cầu thực hiện một phía máy chủ django tồn tại cho node.js trong django. – User

+0

** [Redis] (https://redis.io/) ** có thể giúp, nó giải quyết được vấn đề của tôi –

Trả lời

5

Tôi đang yêu cầu thực hiện django phía máy chủ tồn tại cho node.js trong django.

No. node.js là ngôn ngữ riêng của mình đang chạy trong trình thông dịch riêng của nó. Tuy nhiên nếu bạn đang yêu cầu nếu có một ứng dụng Django cho phép giao tiếp với một khách hàng Socket.IO, sau đó có và không có. Không, bởi vì không có giải pháp được tạo trước nào hiện có, và có bởi vì tất cả các phần bạn cần để thực hiện nó đã tồn tại.

Để thực hiện các giao thức với django, hãy kiểm tra Django-Websocket cho máy chủ backend WebSocket, thư viện Ajax từ Dajax ProjectSocket.IO-rack đó là một viên ngọc ruby ​​mà thực hiện giao thức và ruby ​​là đủ gần trong cấu trúc để django mà bạn có thể nhận được rất nhiều cảm hứng từ nó.

+0

Có Tôi hỏi nếu có một ứng dụng django cho phép giao tiếp với một khách hàng Socket.IO. – User

+0

Không. Không có Socket.IO-django. nhưng như tôi đã nói, Django-websocket + Dajax thực hiện tất cả các phần phía máy chủ bạn cần để thực hiện các giao thức chính mình. – Thomas

+14

Không * sử dụng ** django-websocket **. Tôi là tác giả của nó và giải thích khá một vài lần bây giờ mà nó chỉ đơn giản là không thể sử dụng websockets theo một cách phù hợp tiêu chuẩn với django. Xem [câu trả lời này] (http://stackoverflow.com/questions/4363899/making-moves-w-websockets-and-python-django-twisted/4369471#4369471) và đọc [tuyên bố từ chối trách nhiệm về pypi] (http://pypi.python.org/pypi?%3Aaction=search&term=django-websocket). kthxbye –

20

Chắc chắn bạn có thể!

Bản thân Django không đồng bộ vì vậy bạn phải sử dụng máy chủ Socket.IO song song với máy chủ django bình thường của bạn, node.js không phải lúc nào cũng là lựa chọn tốt nhưng vẫn tồn tại những người khác viết bằng python thuần túy.

đây là blog/hướng dẫn sử dụng gevent làm máy chủ socket.io.

http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent/

Đối với một giải pháp tương tự mà có một chút lịch sử, bạn có thể nhìn vào quay quanh, (www.orbited.org)

+6

Thậm chí có cả [ứng dụng Django: django-socketio] (http://pypi.python.org/pypi/django-socketio/). –

+2

@DenisBilenko, Lưu ý rằng dự án đó về cơ bản không được duy trì và chỉ hoạt động với phiên bản 6 tuổi của socket.io không hoạt động với nhiều trình duyệt hiện đại. Tôi học được điều này một cách khó khăn... – Cerin

1

Đối với một ví dụ của việc sử dụng socket.io với django, bạn có thể muốn để xem django-serverpush. Nó tích hợp django với socket.io như việc vận chuyển và lốc xoáy/tornandio2 như máy chủ async thay vì Node.js

https://github.com/hamax/django-serverpush

khác đã sử dụng django với Node.js + socket.io với RabbitMQ như hàng đợi thông điệp cầu nối giữa hai người. Có một cuộc nói chuyện, "Real-Time Django" tại djangocon 2011 đã mô tả cách tiếp cận này cho các ứng dụng thời gian thực lớn (giải thưởng).

2

Bắt đầu từ đây:

và ở đây:

Có một số ví dụ Django như thế nào để bắt đầu.

Nó dựa trên Gevent, triển khai mô hình đồng thời hợp tác. Nó xuất phát từ một thế giới yêu cầu/đáp ứng, vì nó bổ sung một số callbacks và micro-threads mà không áp đặt nó một cách ồ ạt trên công việc của bạn.

Hãy thử nó ra :)

0

Guys không có hỗ trợ vững chắc cho socket.io với django ... có như thế nào bao giờ chương trình đồ chơi dễ dàng hỗ trợ g-event socket.io hỗ trợ đã được giảm cho năm ngoái là tốt, django-socket.io cũng bị bỏ rơi. Nếu bạn muốn xây dựng một chương trình đồ chơi đơn giản sử dụng django-socket.io và hoặc g-event socket.io chắc chắn, nhưng bất cứ điều gì mà quy mô là không "https://github.com/ryesoft/gevent-socketio" đây là thử nghiệm.

Các vấn đề với nhiều hơn 1 người lao động với gunicorn .... https://github.com/abourget/gevent-socketio/issues/112

Công việc xung quanh là cam kết này. https://github.com/getpenelope/gevent-socketio/commit/6c80c17705c9a1b3adcb0f99abde1c4d369c337b

Tôi nghĩ rằng nó sẽ ném nó ra có chỉ trong trường hợp ai đó đang cố gắng sử dụng điều này trong một môi trường sản xuất như bản thân tôi.

2

Tôi nghĩ cách tốt nhất để giao tiếp không đồng bộ với Django là có máy chủ nút nghe ở cổng khác và sử dụng ứng dụng api của Socket.io. Bằng cách này, bạn không phụ thuộc vào sự hỗ trợ của các mô-đun cho django và rất đơn giản: Node lắng nghe yêu cầu từ khách hàng, chuyển đổi yêu cầu này trong một yêu cầu gửi và gửi đến Django cho cổng nghe Django. Là cách tốt nhất tôi nghĩ.

server.js

var http = require('http'); 
var server = http.createServer().listen(3000); 
var io = require('socket.io').listen(server); 
var querystring = require('querystring'); 

io.on('connection',function(socket) { 
    console.log('Connected to the client'); 
    socket.on('new comment',function(data) { 

     console.log('Web--->Node'); 
     var values = querystring.stringify(data); 
     console.log(values); 

     var options = { 
      hostname:'localhost', 
      port:'8000', 
      path:'/create-comment', 
      method:'POST', 
      headers:{ 
       'Content-Type':'application/x-www-form-urlencoded', 
       'Content-Length':values.length 
      } 
     }; 

     var request = http.request(options, function(response) { 
      response.setEncoding('utf8'); 
      response.on('data',function(data){ 
       //Here return django 
       console.log('Django-->Node'); 
       io.emit('return comment',data); 
      }); 
     }); 

     request.write(values); 
     request.end(); 
    }); 
}); 

views.py

def trysock(request): 
    print 'In tryshok' 
    comments = Comment.objects.all() 
    dic = { 
       'name': 'User', 
       'form': CommentForm(), 
       'comments': comments 
      } 

    return render(request,'index.html',dic) 

@csrf_exempt 
def create_comment(request): 
    print 'Django<---Node' 
    Comment.objects.create(
      user = request.POST['user'], 
      comment = request.POST['comment'] 
     ) 

    response = JsonResponse({'user' : request.POST['user'], 'comment' : request.POST['comment']}) 
    print response.content 
    return HttpResponse(response.content) 

index.html

<div class='col-md-12'> 
    <div class='col-md-6'> 
     <form method='POST'> 
      {% csrf_token %} 
      {{form.comment}} 
      <button id='boton'>Comentar</button> 
     </form> 
    </div> 

    <div id='comentarios' class='col-md-6'> 
     {% for comment in comments %} 
     <p>{{ comment.user }} - {{ comment.comment}}</p> 
     {% endfor %} 
    </div> 
</div> 
<!-- Fin Formulario comentarios --> 

</div> 
<script> 
    var socket = io.connect('http://localhost:3000'); 
    console.log(socket); 
    $('#boton').on('click', Comentar); 

    function Comentar(e) { 
     console.log('Comentar(e)') 
     e.preventDefault(); 

     var datos = { 
      user:"user", 
      comment : 'comment' 
     }; 

     socket.emit('nuevo comentario', datos); 
     console.log('Enviando....: ' + datos.user + '-' + datos.comment); 
    } 

    socket.on('devolviendo comentario', function(data) { 
     console.log('Recibiendo...'); 
     var dato = JSON.parse(data); 
     $('#comentarios').prepend('<p>' + dato.user + '-' + dato.comment + '</p>') 
    }); 
</script> 
Các vấn đề liên quan