我可以将Socket.IO与Django一起使用吗?

我可以将Socket.IO与Django一起使用吗?,django,sockets,web-applications,Django,Sockets,Web Applications,有没有办法将Socket.IO与Django一起使用 我在问django中是否存在node.js的服务器端django实现 不是。node.js是它自己的语言,在自己的解释器中运行。但是,如果您询问是否存在允许与Socket.IO客户端通信的Django应用程序,则回答“是”和“否”。回答“否”是因为当前不存在预先制作的解决方案,回答“是”是因为您需要实现它的所有部分都已存在 要使用django实现该协议,请查看后端websocket服务器、来自和的Ajax库,它是实现该协议的ruby gem,

有没有办法将Socket.IO与Django一起使用


我在问django中是否存在node.js的服务器端django实现

不是。node.js是它自己的语言,在自己的解释器中运行。但是,如果您询问是否存在允许与Socket.IO客户端通信的Django应用程序,则回答“是”和“否”。回答“否”是因为当前不存在预先制作的解决方案,回答“是”是因为您需要实现它的所有部分都已存在

要使用django实现该协议,请查看后端websocket服务器、来自和的Ajax库,它是实现该协议的ruby gem,ruby在结构上与django非常接近,您可以从中获得很多灵感。

当然可以

Django本身不是异步的,因此您必须与普通的Django服务器并行使用Socket.IO服务器,node.js并不总是一个好的选择,但也有一些是用纯python编写的

下面是一个使用gevent作为socket.io服务器的博客/教程


对于类似的解决方案,您可以查看Orbited(www.Orbited.org)

有关将socket.io与django一起使用的示例,您可能需要查看django serverpush。它将django与socket.io集成为传输,将tornado/tornandio2集成为异步服务器,而不是node.js

其他人使用django和node.js+socket.io以及rabbitMQ作为两者之间的消息队列桥梁。在djangocon 2011上有一个名为“实时Django”的演讲,描述了在大型实时(颁奖典礼类型)应用程序中使用这种方法。

从这里开始:

在这里:

关于如何开始,这里有一些Django示例

它基于Gevent,它实现了一个协作并发模型。来自请求/响应世界的好处是,它添加了一些回调和微线程,而不会对您的工作流造成太大影响


试试看:)

伙计们,django对socket.io没有可靠的支持。。。去年,easy toy程序支持g-event socket.io的支持也被取消了,django-socket.io也被放弃了。 如果您想使用django-socket.io和/或g-event-socket.io构建一个简单的玩具程序,当然可以,但任何可扩展的东西都不太可能“这是实验性的”

与一名以上gunicorn员工发生问题。。。。

解决的办法就是这个承诺。


我想如果有人试图在像我自己这样的生产环境中使用它,它会把它扔到那里。

我认为与Django异步通信的最佳方式是让节点服务器在另一个端口监听,并使用Socket.io的api客户机。这样,您就不需要依赖于django模块的支持,而且非常简单:节点侦听来自客户端的请求,在post请求中转换此请求,并将侦听django的端口发送到django。 这是我认为最好的方式

server.js views.py
def trysock(请求):
打印“在tryshok中”
comments=Comment.objects.all()
dic={
“名称”:“用户”,
“形式”:CommentForm(),
“评论”:评论
}
返回呈现(请求,'index.html',dic)
@豁免
def创建_注释(请求):

打印“Django”你不是很具体。基本答案是“否”,因为socket.io是一个支持多浏览器的Node.js程序。另一方面,完全有可能通过本地通道将事件从Django发送到Socket.io服务器,完全有可能通过DBSlayer修改Socket.io中的表行以通知Django更改,甚至有可能两者都在客户机中留下跟踪,以便在这三者之间通信。但您想实现什么呢?我想问的是,django中的node.js是否存在服务器端django实现。可以帮助,它解决了我的问题是的,我在问是否有django应用程序允许与Socket.IO客户端通信。否。没有Socket.IO-django。但正如我所说,DjangoWebSocket+Dajax实现了您自己实现协议所需的所有服务器端部分,不要使用DjangoWebSocket。我是这本书的作者,并且多次解释说,在django中以符合标准的方式使用WebSocket是不可能的。看和读。KTHXbye甚至还有一个@DenisBilenko,请注意,该项目基本上没有维护,只适用于6年前版本的socket.io,它不适用于许多现代浏览器。我通过艰苦的方式学会了这一点……服务器呢?Django侦听来自客户端的请求,然后Django将其发送给NodeJs?什么更好?
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();
    });
});
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)
<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>