Django を使用して RESTFUL Web サービスを開発しています。場合によっては、クライアントのポーリングなしでサーバー オブジェクトを接続されたクライアントにプッシュする必要があります。django-websocket 0.3.0 を使用することにしました。
テストケースを書いていて、nodejs ws client モジュールを使用してサーバーに接続しようとしました
Django の私のビュー関数は次のとおりです。
from django.http import HttpResponse
from django_websocket import accept_websocket, require_websocket
from django.views.decorators.csrf import csrf_exempt
import json, sys, os, time, datetime
@csrf_exempt
@accept_websocket
def home(request) :
if not request.is_websocket():
return HttpResponse('new message')
else:
for message in request.websocket:
message = modify_message(message)
request.websocket.send(message)
request.websocket.close()
js での私のクライアント側コードは次のようになります:-
//Normal Get
var request = require('request');
request('http://127.0.0.1:8000',function(err,resp,flag){
console.log(resp.body);
});
//Opening a websocket
var WebSocket = require('ws');
var ws = new WebSocket('ws://127.0.0.1:8000/', {origin: 'http://127.0.0.1:8000'});
ws.on('open', function() {
console.log('connected');
ws.send(Date.now().toString(), {mask: true});
});
ws.on('close', function() {
console.log('disconnected');
});
ws.on('message', function(data, flags) {
console.log('Roundtrip time: ' + (Date.now() - parseInt(data)) + 'ms', flags);
setTimeout(function() {
ws.send(Date.now().toString(), {mask: true});
}, 500);
});
最初のオプションは、メッセージを「新しいメッセージ」として取得します。一方、2 番目の呼び出しは、クライアント側で次のエラーをスローします。サーバー側では、両方のコマンドが 200OK を通過します。
events.js:72
throw er; // Unhandled 'error' event
^
Error: unexpected server response (200)
at ClientRequest.<anonymous> (../ws/lib/WebSocket.js:603:17)
at ClientRequest.g (events.js:175:14)
at ClientRequest.EventEmitter.emit (events.js:95:17)
at HTTPParser.parserOnIncomingClient [as onIncoming] (http.js:1689:21)
at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:120:23)
at Socket.socketOnData [as ondata] (http.js:1584:20)
at TCP.onread (net.js:525:27)
ちなみに、両方の呼び出しでログに記録するrequest.is_websocket()
と、サーバー側で false の意味が返され、else 部分には決して入りません。
私がここでやっている間違いを理解するのを手伝ってください
ありがとうございました