Можно ли использовать Socket.IO http://socket.io/ с Django?
Могу ли я использовать Socket.IO с Django?
Ответ 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
Я думал, что это выбросит его там просто, если кто-то попытается использовать это в производственной среде, как и я.