Python 使用Django和Socket.io的实时通知
目前,我正在为我的Django项目实现实时通知 我是按照你的指示去做的。问题是,我使用的是Socket.io1.4.5,本教程是为1.0之前的版本编写的。因此,我必须在Socket.io站点上按照指南修改一些代码。我得到的是:Python 使用Django和Socket.io的实时通知,python,django,socket.io,Python,Django,Socket.io,目前,我正在为我的Django项目实现实时通知 我是按照你的指示去做的。问题是,我使用的是Socket.io1.4.5,本教程是为1.0之前的版本编写的。因此,我必须在Socket.io站点上按照指南修改一些代码。我得到的是: var http = require('http'); var server = http.createServer().listen(8002); var io = require('socket.io')(server); var cookie_reader = re
var http = require('http');
var server = http.createServer().listen(8002);
var io = require('socket.io')(server);
var cookie_reader = require('cookie');
var querystring = require('querystring');
var redis = require('redis');
// Supposedly this should store cookie set by Django
io.use(function(socket,accept){
var data = socket.request;
if(data.headers.cookie){
data.cookie = cookie_reader.parse(data.headers.cookie);
return accept(null, true);
}
return accept('error', false);
});
io.sockets.on('connection', function (socket) {
// Redis client
client = redis.createClient();
// Subscribe to notification channel
client.subscribe('notifications.' + socket.handshake.cookie['sessionid']);
console.log('subscribed');
//Grab message from Redis and send to client
client.on('message', function(channel, message){
console.log('on message', message);
socket.send(message);
});
// Unsubscribe
socket.on('disconnect', function() {
client.unsubscribe('notifications.' + socket.handshake.cookie['sessionid']);
});
});
运行此脚本时:
node notifications.js
沉默2秒后,我发现以下错误:
client.subscribe('notifications.' + socket.handshake.cookie['sessionid']);
^
TypeError: Cannot read property 'sessionid' of undefined
at Namespace.<anonymous> (path/to/notifications.js)
at Namespace.emit (events.js:107:17)
at Namespace.emit (/path/to/node_modules/socket.io/lib/namespace.js:206:10)
at /path/to/node_modules/socket.io/lib/namespace.js:174:14
at process._tickCallback (node.js:355:11)
client.subscribe('notifications.'+socket.handshake.cookie['sessionid']);
^
TypeError:无法读取未定义的属性“sessionid”
在命名空间处。(path/to/notifications.js)
位于Namespace.emit(events.js:107:17)
位于Namespace.emit(/path/to/node_modules/socket.io/lib/Namespace.js:206:10)
at/path/to/node_modules/socket.io/lib/namespace.js:174:14
在进程中调用(node.js:355:11)
有人能指出我做错了什么吗?刚刚发现了我的错误 要访问cookie,而不是
socket.handshake
我应该使用socket.request
。因此,我当前的代码如下所示:
var http = require('http');
var server = http.createServer().listen(8002);
var io = require('socket.io')(server);
var cookie_reader = require('cookie');
var querystring = require('querystring');
var redis = require('redis');
io.use(function(socket,accept){
var data = socket.request;
if(data.headers.cookie){
data.cookie = cookie_reader.parse(data.headers.cookie);
return accept(null, true);
}
return accept('error', false);
});
io.on('connection', function (socket) {
// Redis client
client = redis.createClient();
// Subscribe to notification channel
client.subscribe('notifications.' + socket.request.cookie['sessionid']);
console.log('subscribed');
//Grab message from Redis and send to client
client.on('message', function(channel, message){
console.log('on message', message);
socket.send(message);
});
// Unsubscribe
socket.on('disconnect', function() {
client.unsubscribe('notifications.' + socket.request.cookie['sessionid']);
});
});
你考虑过第三方服务吗?Ryan,还没有。我是webdev的新手,所以坚持使用我看到的第一个解决方案。目前,我的应用程序仅限于网站——使用第三方服务有意义吗?相反,我发现使用第三方服务会将开发和维护架构的许多麻烦外包出去。例如:看看PubNub,有一个简单的API来处理所有实时消息。可能不完全符合要求,但有很多人喜欢这样。套接字是非常高级的东西,尤其是从Django开始,Django是一个非常围绕同步http构建的框架