Подтвердить что ты не робот

Могу ли я использовать Socket.IO с Django?

Можно ли использовать Socket.IO http://socket.io/ с Django?

4b9b3361

Ответ 1

Конечно, вы можете!

Django сам по себе асинхронный, поэтому вам нужно использовать сервер Socket.IO параллельно с вашим обычным сервером django, node.js не всегда хороший выбор, но существуют другие, написанные на чистом питоне.

Вот блог/учебник, в котором gevent используется как сервер socket.io.

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

Для аналогичного решения, которое имеет немного больше истории, вы можете посмотреть Orbited, (www.orbited.org)

Ответ 2

Я спрашиваю, существует ли реализация django на стороне сервера для node.js в django.

Нет. node.js - это собственный язык, запущенный в своем интерпретаторе. Однако, если вы спрашиваете, есть ли приложение Django, которое позволяет общаться с клиентом Socket.IO, тогда да и нет. Нет, потому что в настоящее время нет готового решения, и да, потому что все части, которые вам нужно реализовать, уже существуют.

Чтобы реализовать протокол с помощью django, Django-Websocket для сервера веб-сервера бэкэнд, библиотеки Ajax из Проект Dajax и Socket.IO-rack, который является рубиновым камнем, который реализует протокол, и рубин близок достаточно в структуре для джанго, что вы можете получить от него много вдохновения.

Ответ 3

Начните здесь:

и здесь:

Есть несколько примеров Django о том, как начать.

Он основан на Gevent, который реализует кооперативную модель concurrency. Это здорово приходит из мира запросов/ответов, поскольку он добавляет некоторые обратные вызовы и микропотоки, не налагая их на массовый процесс.

Попробуйте:)

Ответ 4

Я думаю, что лучший способ асинхронной связи с Django - это сервер node, прослушивающий в другом порту и использующий api-клиент Socket.io. Таким образом, вы не зависимы от поддержки модулей для django и очень просты: node прослушивание запроса от клиента, преобразование этого запроса в почтовый запрос и отправка в 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> 

Ответ 5

Для примера использования socket.io с django вы можете посмотреть django-serverpush. Он интегрирует django с socket.io в качестве транспорта и торнадо /tornandio 2 в качестве асинхронного сервера вместо node.js

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

Другие использовали django с node.js + socket.io с rabbitMQ в качестве моста очереди сообщений между ними. В djangocon 2011 был обсужден "Real-Time Django", в котором описывался этот подход для больших приложений в режиме реального времени (награда-шоу).

Ответ 6

Ребята, нет надежной поддержки socket.io с django... есть ли когда-либо легкая поддержка программы для игр. Поддержка g-event socket.io была удалена и за последний год, django-socket.io также оставлен, Если вы хотите создать простую игрушку, используя django-socket.io или g-event socket.io, но все, что масштабируется, маловероятно " https://github.com/ryesoft/gevent-socketio" это экспериментально.

Проблемы с более чем одним работником с пушкой https://github.com/abourget/gevent-socketio/issues/112

Обход - это фиксация. https://github.com/getpenelope/gevent-socketio/commit/6c80c17705c9a1b3adcb0f99abde1c4d369c337b

Я думал, что это выбросит его там просто, если кто-то попытается использовать это в производственной среде, как и я.