【问题标题】:Implementing Django and socket.io to work together实现 Django 和 socket.io 一起工作
【发布时间】:2016-01-29 00:10:21
【问题描述】:

我正在关注tutorial 使用 Django 和 Socket.io(节点 js)构建实时应用程序。我正在一个 vagrant box 中构建它,并在我的主机文件中配置了 vagrant 机器。现在由于教程是一个旧帖子,我有很多错误。然而,在修复了一些不推荐使用的代码之后,这就是它的样子。

聊天.js:

var server = require('http').createServer().listen(4000);
var io = require('socket.io').listen(server, {
    'authorization': function(data, accept) {
        if (data.headers.cookie) {
            data.cookie = cookie_reader.parse(data.headers.cookie);
            return accept(null, true);
        }
        return accept('error', false);
    }
});
var cookie_reader = require('cookie');
var querystring = require('querystring');
var redis = require('redis');
var sub = redis.createClient();
sub.subscribe('chat');

io.on('connection', function (socket) {
    sub.on('message', function(channel, message){
        socket.send(message);
    });
    socket.on('send_message', function (message) {
        values = querystring.stringify({
            comment: message,
            sessionid: socket.handshake.cookie['sessionid'],
        });

        var options = {
            host: 'localhost',
            port: 80,
            path: '/node_api',
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Content-Length': values.length
            }
        };

        //Send message to Django server
        var req = http.get(options, function(res){
            res.setEncoding('utf8');

            //Print out error message
            res.on('data', function(message){
                if(message != 'Everything worked :)'){
                    console.log('Message: ' + message);
                }
            });
        });

        req.write(values);
        req.end();
    });
});

index.html:

<head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" type="text/javascript"></script>
    <script src="{% static "js/socket.io.js" %}"></script>
    <script>
        $(document).ready(function () {
            var socket = io('http://localhost:4000');
            socket.on('connect', function () {
                console.log("connect");
            });
            ...
            ...
            ...
    </script>

但是现在当我加载页面时,我遇到了这个错误

GET http://localhost:4000/socket.io/?EIO=3&transport=polling&t=LA7JSiVnet::ERR_CONNECTION_REFUSED

在 index.html 中我更改了这个

var socket = io('http://localhost:4000');

到这里

var socket = io();  

我收到此错误

获取http://vagrant-box.com/socket.io/?EIO=3&transport=polling&t=LA7NH61404(未找到)

我做错了什么?请帮我解决这个问题。您的帮助将不胜感激。谢谢。

【问题讨论】:

  • 我正在尝试解决完全相同的问题。您是否从 django 应用程序提供 index.html?
  • @JesusGomez 是的。我从home(requrest) 方法中的“核心”应用程序的视图返回index.html。虽然它是否在project-name.view 内并不重要。
  • 你有没有运气实现这个?很高兴看到 socket.io 1.0+ 的完整解决方案

标签: django node.js socket.io


【解决方案1】:

首先请注意,您不能从 django 提供 socket.io js,socket.io 必须提供它自己的 js 文件,因为它使用一些聪明的魔法来确定它必须发送的文件。

改变

&lt;script src="{% static "js/socket.io.js" %}"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="http://localhost:4000/socket.io/socket.io.js"&gt;&lt;/script&gt;

(您必须在生产环境中更改这些网址)

之后,您必须让 socket.io 知道连接到 node.js 服务器的确切架构、主机和端口,否则您将得到 404,因为套接字将尝试连接到您的 django 服务器正在侦听的端口。

var socket = io('http://localhost:4000');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2019-07-17
    • 2011-12-09
    • 1970-01-01
    • 2018-04-13
    • 2014-10-30
    相关资源
    最近更新 更多