我可以在Django上使用Socket.IO吗?

时间:2010-11-16 00:27:33

标签: django sockets web-applications

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

6 个答案:

答案 0 :(得分:21)

当然可以!

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

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

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

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

答案 1 :(得分:5)

  

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

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

要使用django实现协议,请查看Django-Websocket后端websocket服务器,来自Dajax ProjectSocket.IO-rack的Ajax库,它是实现协议的ruby gem,而ruby是关闭的结构足够django,你可以从中获得很多灵感。

答案 2 :(得分:2)

从这里开始:

在这里:

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

它基于Gevent,它实现了一种协作并发模型。来自请求/响应世界的很棒,因为它添加了一些回调和微线程,而没有在工作流程中大量使用它。

尝试一下:)

答案 3 :(得分:2)

我认为与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> 

答案 4 :(得分:1)

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

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

其他已经使用django和node.js + socket.io一起使用rabbitMQ作为两者之间的消息队列桥。 2011年djangocon上有一个名为“Real-Time Django”的演讲,描述了这种用于大型实时(奖项显示型)应用的方法。

答案 5 :(得分:0)

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

超过1名带枪炮的工人的问题...... https://github.com/abourget/gevent-socketio/issues/112

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

我认为只要有人试图在像我这样的生产环境中使用它,它就会抛弃它。