我可以将Socket.IO与Django一起使用吗?
有没有办法将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,
我在问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对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>