DjangoでSocket.IO http://socket.io/ を使用する方法はありますか?
もちろんできます!
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= Djangoのnode.jsの実装が存在するかどうかを尋ねています。
いいえ。node.jsは、独自のインタープリターで実行される独自の言語です。ただし、Socket.IOクライアントとの通信を許可するDjangoアプリがあるかどうかを尋ねる場合は、yesとnoを選択します。それを実装するために必要な部分はすでに存在します。
Djangoでプロトコルを実装するには、バックエンドWebsocketサーバーの Django-Websocket 、 Dajax Project および Socket.IO-rack のAjaxライブラリをチェックしてください。これはRubyプロトコルを実装するgemであり、Rubyは構造的にDjangoそれから多くのインスピレーション。
Djangoとの非同期通信の最良の方法は、ノードサーバーが別のポートでリッスンし、Socket.ioのapiクライアントを使用することだと思います。この方法では、サポートに依存しませんDjangoのモジュールの非常に簡単です:Nodeクライアントからのリクエストをリッスンし、このリクエストを投稿リクエストで変換し、Djangoです。
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>
ここで始める:
そしてここ:
始める方法については、Djangoの例があります。
これは、協調的並行性モデルを実装するGeventに基づいています。リクエスト/レスポンスの世界から来るのは素晴らしいことです。ワークフローに大量の負荷をかけることなく、コールバックとマイクロスレッドを追加するからです。
やってみよう :)
Djangoでsocket.ioを使用する例については、Django-serverpushをご覧ください。トランスポートとしてsocket.io、node.jsの代わりに非同期サーバーとしてtornado/tornandio2を使用して、Djangoと統合します。
https://github.com/hamax/Django-serverpush
他はDjango with node.js + socket.io with rabbitMQを2つの間のメッセージキューブリッジとして使用しました。大規模なリアルタイム(アワードショータイプ)アプリケーションのアプローチ。
Djangoでsocket.ioをしっかりサポートしているわけではありません...昨年もg-event socket.ioのサポートが簡単に廃止され、Django-socket.ioも廃止されました。 Django-socket.ioまたはg-event socket.ioを使用して簡単なおもちゃのプログラムを構築したいが、スケーリングするものがありそうにない場合は、「 https://github.com/ryesoft/gevent-socketio "これは実験的なものです。
Gunicornでの複数のワーカーの問題.... https://github.com/abourget/gevent-socketio/issues/112
回避策はこのコミットです。 https://github.com/getpenelope/gevent-socketio/commit/6c80c17705c9a1b3adcb0f99abde1c4d369c337b
誰かが私のような本番環境でこれを使用しようとしていた場合に、それをそこに放り出すと思った。