【问题标题】:error while using Django-websocket使用 Django-websocket 时出错
【发布时间】:2013-09-09 10:59:58
【问题描述】:

我正在使用 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 部分。

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

谢谢

【问题讨论】:

    标签: python django node.js websocket


    【解决方案1】:

    嗯,

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

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

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

    感谢您的支持!!!

    【讨论】:

    • 让 Django 1.5 或 1.6 与 websockets 一起工作有什么运气吗?分享一下你对twisted 和gevent 的体验
    • 嗨 sj7,我们将 websocket 部分完全移出 Django 并移至 gevent-websocket。从那里是一阵微风。根据我的经验,Django 或任何基于 WSGI 的框架都不稳定,无法与 websocket 实现一起使用
    • 嗨,杰加,感谢分享。计划迁移到 node.js + socket.io 实现
    猜你喜欢
    • 1970-01-01
    • 2017-01-17
    • 2021-09-18
    • 2015-07-15
    • 2013-03-03
    • 2013-02-05
    • 1970-01-01
    • 2018-02-18
    • 2016-01-21
    相关资源
    最近更新 更多