這篇文章主要介紹了使用Node.js和Socket.IO擴展Django的實時處理功能,用異步處理實時功能是相當強大的,文中給出的例子是建立一個實時聊天室,需要的朋友可以參考下
今天,我們的目標是使用Django,Redis,和Socket.IO建立一個實時的聊天室。雖然幾乎所有的Web應用程序都可以建立一個聊天室的。這篇文章將以較高的水平告訴你如何將基於REST的應用程序轉換成一個實時的Web應用程序的。我會使用Django創建REST的部分,實際上自由地使用任何你舒服的語言/框架均可。接下來,讓我們跳進代碼,先列舉我們所需要的部分。
組成:
Django 1.4+
Redis 2.6.x (版本可選,但是建議使用)
Redis-py 2.7.x (僅當你使用Redis時需要)
Node.js v0.8.x
Socket.IO v0.9.x
Cookie v0.0.5
數據庫、sqlite、其他你覺得類似數據庫形式的 均可
你的使用的版本可能與我不同,我暫時未測試其他版本,全部使用當前最新穩定版本。如果你無法通過下面方法安裝,我已經編譯好Ubuntu的軟件包。你可以從評論中得到其他操作系統版本情況。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #https://docs.djangoproject.com/en/dev/topics/install/ sudo apt-get install python-pip sudo pip install django #http://redis.io/download sudo apt-get install redis-server #https://github.com/andymccurdy/redis-py sudo pip install redis #https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager sudo apt-get install python-software-properties sudo add-apt-repository ppa:chris-lea/node.js sudo apt-get update sudo apt-get install nodejs #https://github.com/LearnBoost/socket.io npm install socket.io #https://github.com/shtylman/node-cookie npm install cookie讓我們從Django Project開始
?
1 2 3 django-admin.py startproject realtime_tutorial && cd realtime_tutorial python manage.py startapp core mkdir nodejs執行完以上的代碼,django project就配置好了,接下來要做的是在settings文件中設置數據庫。先創建一個空白數據庫。(這是一個settings file的例子。在我的app中添加了一個“core”然後配置templates和urls的路徑。你可以隨意更改settings中的配置信息,但是要與你的app相對應。
Model
models很簡單,我們將要建一個包含user和text的表。如果你想讓他更復雜一些,可以添加chatroom等信息。(為了簡單起見,這裡只寫了兩個)
?
1 2 3 4 5 6 from django.db import models from django.contrib.auth.models import User class Comments(models.Model): user = models.ForeignKey(User) text = models.CharField(max_length=255)這就是我們將要使用的model,接下來執行下面的syncdb代碼(第一行代碼),創建數據庫。然後創建幾個user來測試。(第二行代碼)
?
1 2 3 4 python manage.py syncdb python manage.py createsuperuser Node Server With Socket.IO這一部分將要介紹實時信息的發送和獲取。使用Node.js創建一個依賴Socket.IO的app server,使用Redis 來做這項苦差事。在nodejs字典中,創建一個叫做“chat.js”的文件,然後把它放在這裡:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 var http = require('http'); var server = http.createServer().listen(4000); var io = require('socket.io').listen(server); var cookie_reader = require('cookie'); var querystring = require('querystring'); var redis = require('socket.io/node_modules/redis'); var sub = redis.createClient(); //訂閱chat channel sub.subscribe('chat'); //配置socket.io來存儲Django設置的cookie io.configure(function(){ io.set('authorization', function(data, accept){ if(data.headers.cookie){ data.cookie = cookie_reader.parse(data.headers.cookie); return accept(null, true); } return accept('error', false); }); io.set('log level', 1); }); io.sockets.on('connection', function (socket) { //把信息從Redis發送到客戶端 sub.on('message', function(channel, message){ socket.send(message); }); //客戶端通過socket.io發送消息 socket.on('send_message', function (message) { values = querystring.stringify({ comment: message, sessionid: socket.handshake.cookie['sessionid'], }); var options = { host: 'localhost', port: 3000, path: '/node_api', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': values.length } }; //使用Django server發消息 var req = http.get(options, function(res){ res.setEncoding('utf8'); //輸出錯誤信息 res.on('data', function(message){ if(message != 'Everything worked :)'){ console.log('Message: ' + message); } }); }); req.write(values); req.end(); }); });首先,我們導入並創建http server來監聽localhost 4000端口。然後訂閱Redis的 &quo