6

我正在使用 Django 开发一个 RESTFUL 网络服务。在某些情况下,我们需要将服务器对象推送到连接的客户端,而不需要客户端轮询。我们决定使用 django-websocket 0.3.0。

我正在编写测试用例并尝试使用 nodejs ws 客户端模块连接到服务器

我在 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);
});

第一个选项将消息作为“新消息”获取另一方面,第二个调用在客户端引发以下错误。在服务器端,两个命令都通过 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()在两个调用上都记录它,它会在服务器端返回错误的含义,它永远不会进入 else 部分。

请帮助我了解我在这里犯了什么错误

谢谢

4

1 回答 1

1

出色地,

我下载了他们的全部代码(不是 pip install)并运行提供的示例聊天程序。同样的错误。对于任何 ws:// 调用,系统都会发送一个 400 响应代码。pypi 站点上链接的 git hub 项目页面返回 404 错误。我无法提交错误报告。给开发者发了邮件,没有收到任何回复。

可能在新的 Django 1.5.2 版本上应该有一些问题。

我认为这是一个死项目,因此转向一个复杂但有效的解决方案,如 gevent 或 twisted。

谢谢你的支持!!!

于 2013-09-10T13:13:00.010 回答