6

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 部分には決して入りません。

私がここでやっている間違いを理解するのを手伝ってください

ありがとうございました

4

1 に答える 1

1

良い、

コード全体をダウンロードし (pip install ではありません)、提供されたサンプル チャット プログラムを実行しました。同じエラー。システムは、ws:// 呼び出しに対して 400 応答コードを送信します。pypi サイトにリンクされている git ハブ プロジェクト ページが 404 エラーを返します。バグレポートを提出することはできません。開発者に電子メールを送信しましたが、応答がありませんでした。

おそらく、新しい Django 1.5.2 バージョンでは何かが壊れているはずです。

これは死んでいるプロジェクトであり、gevent や twisted のような複雑だが実用的なソリューションに移行していると思います。

ご協力ありがとうございました!!!

于 2013-09-10T13:13:00.010 に答える