本文自maxburstein.com翻译而来,文章原作者为Max Burstein, 已经作者授权翻译用于非商业用途。原文地址:http://maxburstein.com/blog/realtime-django-using-nodejs-and-socketio/
曾在项目中使用python非阻塞框架eventlet来实现过相似功能,这篇文章介绍了另外一种实现实时在线交互的方式。
我们今天的目标是使用Django, Node.js, Redis和Socket.IO创建一个实时在线聊天室。虽然使用其它技术也可以轻松创建类似于聊天室的应用, 本文将展示如何把无状态的REST app(关于REST概念, 请自行google之)变为实时交互的web app, 我将用Django来创建REST部分, 你也可以使用任何你熟悉的语言和web框架来代替,闲话少说, 代码先上,对了,在上代码之前,我们有以下东东需要安装。
安装 Django 1.4+ Redis 2.6.x (somewhat optional, but recommended) Redis-py 2.7.x (only needed …如果你还没读过第一篇,先跑到这里去瞧一瞧,我保证你多花这么一点时间是值得的。
到目前为止,我们已经学会了用Node.js做一些基本的事(比如用来打印金光闪闪的Hello World), 接下来我们将去学习一下回调函数并了解为什么这玩意是如此的有用。
为什么是Node.js?现在已经有很多编程语言,并且各有各的优缺点。能够对比不同编程技术,并选出最佳编程语言来解决问题,是创建一个可靠的产品的重要前提条件。跟所有别的编程语言一样,Node.js有它自身的优点和缺点,那么让我们来看一下应该在什么情况下使用Node.js吧。
优点:
a) Node.js用于解决高并发带来的瓶颈。比如你要创建一个需要短时间内处理成千上万的请求,那么Node.js无疑是一个很棒的选择。 b) 这就是JavaScript,这意味着任何有前端JavaScript编程经验的人都可以把以前的经验带到Node.js编程里来,并且它是基于Google的V8引擎,速度极快。 c) 如果你在客户端和服务器端同时使用JavaScript,这会让你的编程变得轻松和快速。比如:你如果要做一些校验,服务器端和客户端可以共用一样的代码。而前后端数据结构一致,数据传输时超容易。 d) 你会让那些做PHP的同志们惊讶得下巴掉下来。(这哥们黑PHP可真是不遗余力啊。)光说好的也不行对吧,让我们来看一下不好的。
缺点:
a) 这是一门新技术,开发者们还来不及创建健壮的测试模型,也还没有好用的IDE出现。并且当出现问题时,能找到的现成解决方案和文档要比像PHP一样的技术少得多。虽然在当下这是一个劣势,但随着这门技术越来越流行,相信假以时日,就会积累够多的资源可以快速轻松地开发。 b) …这是我的关于Node.js系列入门教程的第一篇。必须说明一下,我并不是Node.js的专家,但是尝试向别人解释这是怎么回事是自我学习的一个好方法。如果你发现有些地方并不是那么正确,请提出来让我知道以便修正,谢之。
最近Node.js如此流行,到处是讨论这个的话题,我决定一探究竟学学这玩意儿。软件行业技术更新如此之快,如果落在后面是很危险滴(汗,这哥们才20岁出头,就有这么强的落后于时代的危机感)。如果你不想落后于时代,不想失业,学习新的编程语言更新自己的技能是作为程序员非常重要的一件事情。如果你不能认真对待此事,想想那些菜鸟新程序员不能找到工作的悲惨境地吧。
好了,闲话少说,进入正题(铛铛铛铛)。
Node.js是一个服务器端JavaScript实现。这意味着所有Javascript的牛B特性都能在Node.js里得到支持,同样意味着如果你以前有JavaScript编程经验的话,你学习Node.js将占有极大的优势。Node.js刚出现没几年,哪怕是一直用这个东西工作的,也只是几年,对比C这些古老语言有这么多人在用,这玩意没多少人会,如果你会的话,比单纯php程序员的竞争力要提高不少吧?(作者观点,用php的同学不要在评论里骂我。。。)
开始Hello World吧让我们来开始写第一个Hello Wrold程序,首先到http://www.nodejs.org 去下载并安装node.js。安装好之后,用你喜欢的文本编辑器创建一个JavaScript文件,内容如下:
console.log("Hello World");保存为"hello.js" ,并且在终端里用如下命令运行程序:
node hello.js现在你应该在终端里看到金光闪闪的“Hello World”两个大字了。如果只想看到这两个字,那么到这里就完了,不过我相信你更想看到在浏览器里怎么看到这两个字,好吧,打开你刚才创建的hello.js这个文件,重新编辑如下:
var http = …