我可以在 Django 中使用 Socket.IO 吗? [关闭]

Posted

技术标签:

【中文标题】我可以在 Django 中使用 Socket.IO 吗? [关闭]【英文标题】:Can I use Socket.IO with Django? [closed] 【发布时间】:2011-05-10 13:32:36 【问题描述】:

有没有办法在 Django 中使用 Socket.IO http://socket.io/?

【问题讨论】:

你不是很具体。基本答案是“不”,因为 socket.io 是一个支持多浏览器的 Node.js 程序。另一方面,完全可以通过本地通道将事件从 Django 发送到 Socket.io 服务器,并且完全可以通过 DBSlayer 从 Socket.io 修改表行以通知 Django 更改,甚至两者都可以在客户端留下痕迹以在所有三者之间传达状态。但是你想要完成什么? 我在问 django 中的 node.js 是否存在服务器端 django 实现。 Redis 可以帮忙,它解决了我的问题 【参考方案1】:

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

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> 

【讨论】:

保留器怎么样? Django 监听来自客户端的请求,然后 Django 将其发送到 NodeJs?什么更好?【参考方案2】:

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

超过 1 名工人使用 gunicorn 的问题.... https://github.com/abourget/gevent-socketio/issues/112

解决方法是这个提交。 https://github.com/getpenelope/gevent-socketio/commit/6c80c17705c9a1b3adcb0f99abde1c4d369c337b

我认为它会把它扔在那里,以防有人试图在像我这样的生产环境中使用它。

【讨论】:

【参考方案3】:

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

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

要使用 django 实现协议,请查看后端 websocket 服务器的 Django-Websocket、来自 Dajax Project 和 Socket.IO-rack 的 Ajax 库,这是一个实现协议的 ruby​​ gem,并且 ruby​​ 在结构上与 django 足够接近你可以从中得到很多灵感。

【讨论】:

是的,我在问是否有允许与 Socket.IO 客户端通信的 django 应用程序。 没有。没有 Socket.IO-django。但就像我说的,Django-websocket+Dajax 实现了你自己实现协议所需的所有服务器端部分。 不要使用django-websocket。我是它的作者,现在解释了很多次,根本不可能在 django 中以符合标准的方式使用 websockets。请参阅this answer 并阅读the disclaimer on pypi。再见【参考方案4】:

从这里开始:

http://gevent-socketio.readthedocs.org

这里:

https://github.com/abourget/gevent-socketio

有一些关于如何开始的 Django 示例。

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

试试看:)

【讨论】:

【参考方案5】:

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

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

其他人使用 django 和 node.js+socket.io 和 rabbitMQ 作为两者之间的消息队列桥。在 djangocon 2011 上有一个演讲,“Real-Time Django”,描述了将这种方法用于大型实时(award-show-type)应用程序。

【讨论】:

【参考方案6】:

当然可以!

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

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

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

对于具有更多历史的类似解决方案,您可以查看 Orbited (www.orbited.org)

【讨论】:

甚至还有Django application: django-socketio。 @DenisBilenko,请注意,该项目基本上没有维护,仅适用于 6 年前的 socket.io 版本,该版本不适用于许多现代浏览器。我很难学到这一点......

以上是关于我可以在 Django 中使用 Socket.IO 吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

允许多个用户加入聊天室(使用 Django、Socket.io 和 node.js)

Django:使用 Redis PubSub、Node.js 和 Socket.io 的 JSON 通知

带有django和python socket io的事件

NodeJS、Express 和多事的 Socket.io

Socket.io 不适用于 nginx

我可以在 socket.io 的命名空间中使用房间吗