webfaction上一键部署Django应用
Webfaction是一款聪明体贴的虚拟主机(除了hosting应用外,我每天都拿来Fuck G/F/W),对程序员友好是她的一大卖点。本文以部署Django应用为例,看看Webfaction是如何工作的。
在开始之前,先简单介绍一下Webfaction对网络应用所做的一些定义:域名(Domain)、应用程序(Application)、站点(Site)。
域名(Domain):指常规的域名,一个域名只可以对应一个站点(Site),但一个站点(site)可以绑定N个域名。webfaction同时可提供域名托管服务,只要把域名的NameServer指向webfaction的名字服务器即可,webfaction提供无限多个子域名哦。
应用程序(Application) :应用程序表示一个Web应用,如一个使用Django写的Blog,或是一个php的bbs。应用程序必须成为网站才可以被访问,所以建立完应用后,webfaction并不会马上运行。一个Web应用,可以用于多个站点。
站点(Site) :站点就是网站,可以通过域名表现出来的,如www.fallever.com就是一个站点,iloveu.fallever.com又是一个站点。
其实这些概念的关系很简单, 只是上面可能讲复杂了,看不懂不要紧,继续看就是了。
建立一个Django应用程序
通过https://panel.webfaction.com登录到控制台,点击 “Domains / websites -> Applications”进入应用程序列表。

进入应用程序列表后,在列表的右下角,有个新增应用程序的小图标,点击开始新建一个应用程序。

接下来会来到创建应用程序页面,我们需要填写一个表单,表单有几个项:
Name:填入应用的名称,如example。
App type:嘿,这里是魔术发生的地方,webfaction为我们准备了近百种内置应用程序模板,我们创建应用程序所要做的仅仅是选择应用的模板,然后点击创建即可。
App doc:这是对所选择应用类型的说明文档。
Extra Info:附加信息,依所选的应用类型而定。

我们现在要创建一个名叫example的Django应用。那么,我们输入应用名字,接着,点击App type展开应用类型列表。OMG!
当Django就占满了一页!你想要使用任何版本的Django都可以,webfaction提供的Django部署方式有包含但不限两种:Django + mod_wsgi和Django + mod_python。
当然,除了Django以外,webfaction提供大量python和python以外的web应用框架和应用程序,如CherryPy,TurboGear,Rails,PHP,WordPress,Joomla,Durpal,甚至Plone,Zope全系列。除此之外,还可以一键安装Trac,subversion,AWStats等协合工具,源码控制系统和网页统计应用。更重要的是,webfaction不仅能做这些,你自己可以在上面跑列表里面没有的应用,如写一段代码监听端口,或者是跑Java虚拟机!这,正是webfaction吸引我的一个重要原因。
有图有真相:

最后,我选择了使用Django最新版本的代码与mod_python来架设新应用。现在点击Create来创建吧!

千真万确,创建一个Django应用并让它跑起来就那么简单:填个名字,选个模板,点个Create。想起以前在其他主机上面部署个Django应用累得够呛,版本稍有与服务器的不一样的话,麻烦更大。而在webfaction,这一切都不用我担心。
创建一个子域名
应用是建立起来了,怎么样访问呢?那得有个域名!没错。得配个域名。
webfaction会给每一位用户一个二级域名,那就是“用户ID.webfactional.com”,比如我的二级域名就是“jeffjie.webfactional.com”,我们可以在此基础上建立三级域名来访问我们刚才建立的应用。
回到webfaction控制面板,我们通过点击"Domain / websites -> Domains"来访问域名列表。

在域名列表里有一个默认的域名了,那就是"用户ID.webfactional.com"。点击该行右边的编辑按钮进行域名编辑页面。

在此,我们可以给一个域名添加无限多个子域名,而这一次,我们按照上图的指示,增加一个子域名,名叫example,也就是希望将来可以通过example.jeffjie.webfactional.com来访问到刚才创建的应用。
创建一个站点
有同学可能不禁要问,应用有了,域名有了,可以访问了吧?答案是差不多矣,只差绑定。
所谓的站点,不过是域名与应用的关系体现,域名与应用是多对多的关系,站点其实就像一张中间表,应用映射到不同的域名就是不同的站点了。webfaction这样的设计很聪明,极大程度地复用Web应用。
肺话不多讲,直指创建站点吧!还是在控制面板里,通过"Domain / websites -> Websites" 来访问站点列表。在列表右下方点击创建站点图标进入创建页面:

填写表单来创建站点,站点命令还是叫example吧。Ip是指你正在用的虚拟主机地址,不用管。选择该站点相应的域名,可以多选,这里我们选择刚建好的example.jeffjie.webfactional.com。
值得注意的是Site apps,这里配置的是路径与应用程序的关系,如图所配置,代表着用户访问根目录时,所访问的是example应用,可以建多个这样的路径与应用的映射,例如我要为站点加一个blog,我会配一个"/blog"的路径,指向一个wordPress应用。
最后,还是点击Create按钮,完成最后一步。
访问站点
现在马上看看我们努力的成果吧!访问http://example.jeffjie.webfactional.com 看看。。
咦,怎么是这个结果呢?

是的,webfaction的域名绑定可能还没见效,稍等一两分钟就可以了。(同学们如果现在访问http://example.jeffjie.webfactional.com的话还会是这样,因为我写完这篇文章后马上删除了这个站点,减少资源占用)。
一两分钟后,再访问一次,结果变成了Django的欢迎页面:

都发生了什么事
简简单单几步操作搞定了Django应用的安装,里面都有些什么样的玄机?其实很简单,Webfaction只是把一些脏活累活包揽了罢了。咱们SSH上去看看。

Webfaction在用户目录下的webapps下面创建了一个example应用,下面有四个文件夹,apache2,bin,lib,myproject。
apache2:是的,webfaction是使用apache来做为动态网页服务器,最外层的服务器是nginx。它给每个应用分配一个apache线程,可以独立启动,停止和重启。
lib:存放关于该应用的库,如python,Django源码等,正因为这样才使得每个应用可以有自己特殊的运行环境。
myprojects:webfaction创建的默认Django project。以后正式部署你自己的应用时,记得要修改apache2/conf/httpd.conf里面的内容。
这里也截一个http.conf的屏吧,算得上是经典的mod_python配置了。

小结
Webfaction的特点就是方便,对程序员特别友好,使用webfaction后,我再没有在部署方面浪费太多工夫,这对我们说,已经是很大程度解放了。
如上面所讲的,不仅仅是Django哦,很多现在流行的应用或框架都可以容易地安装或部署。如果你看了觉得心动,那么,加入我们的队伍吧。
给博客增加文章归档功能
博客怎能没有归档功能,长假后的第一个短假,我为自己的博客加上了归档的功能。本来用Django嘛,博客归档使用Generiv View来实现是最简单不过了,不过我这个是多用户博客系统,Generic View在这时没能帮上忙,只有自己动手了。
最终博客归档的效图果如下(左图),参考了blogger的归档风格(右图),可折叠查看博客内所有文章,归档粒度去到月份。

关于TreeView的组件,我开始想用Jquery的官方插件Treeview,但后来弃用了,使用国人的lightTreeview 。原因是Treeview长年不更新,文档少,而lightTreeview更小巧,可订制性强,有详细的使用文档,严重推荐之。
PS。Django的内置Filter真全,今天才知道有一个unordered_list的过滤器,Django想的好周到!尽管我这次没用上。
PS2。Drobox用来做博客图片存储空间很方便。
我得了强迫性不写博客症
我又更新博客了!看一眼上一次更新的时间为24天前,哇。。我又那么久没有更新。。其实我每天都希望去更新博客,写一些感想、分享一些技巧。但是在半个月前,当我决定升级一下我的博客时,我开始强迫自己不写博客,不到升级完成也不写。。果然,我就像患了“强迫性不写博客症”一样,一连24天没有更新了。
可以继续更新博客,有种畅快淋漓的感觉!很解放的感觉,就像憋了一天的尿突然遇上厕所一样。这也许是强迫症的唯一好处了。。
我发现自己比较容易患上“强迫性XXX”症或“XXX强迫症”,如“信息强迫症”,“twitter强迫症”,“闲着无事上厕所强迫症”等。。同时,我发现,越是完美主义者,越容易患上这种强迫症,因为完美主义本身就是一种强迫症。。
现在好多了,我的博客程序在国庆长假的最的一天修改完成,我接下来要一口气写好多好多东西了。。
提一下这次博客程序的修改:
- Django升级到了最新版本。
- 支持在线安装。
- 完全使用Django admin来替换掉原来的写作后台,原因是Admin的可订制性越来越强大和灵活了。多个博客后台也不在话下。
- 一些样式上的小改变。
- 用tinyMCE换掉了FCK,但丢失了上件上传的功能。
- 一下子支持了一个人同时管理多个博客。
以后还会每天挤点时间出来折腾这个博客程序,但这次不会再让“强迫性不写博客症”发作了。
像CSS选择器一样用BeautifulSoup
较早前写扒虫多,虽然BeautifulSoup很 好用,但厌倦每次都要手动去编写复杂的Dom元素定位语句,突然想,能不能像CSS选择器一样,只给一个表达式就返回我想要的东西?后来在网上找了下没找 着,想了想工作量也不大就自己实现了一个,目前支持ID,Class,标签及属性选择器、支持 space、 >、 + 操作符,基本上已满足大部份定位需求。
代码见附件里的BTSelector.py,另附UnitTest。
常见使用方式是:
注意,本脚本依赖于BeautifulSoup,所以,使用之前请确保你已经安装了。
python 代码
- from BTSelector import findAll
- soup = BeautifulSoup(htmlContent)
- nodes = findAll('div.navigator
-
用testCase作为使用示例:
一、上一个复杂一点的用例:
python 代码
- def testMixSelection(self):
- target = "
- html = '''
- <div id="header">
- <div id="name">
- <a>test</a>
- <a>right</a>
- <a>ok</a>
- </div>
- <div id="your">
- </div>
- </div>
- <div id="body">fk
- </div>
- '''
- soup = BeautifulSoup(html)
- ret = findAll(target,soup)
- self.assertEqual(2,len(ret))
二、再上一个使用位置操作符的用例:
python 代码
- def testPosition(self):
- target = "h2 + ul > li > a"
- html = '''
- <h2>title</h2>
- <ul>
- <li><a href="#">nothing</a></li>
- <li><a href="#">ok</a></li>
- <li><a href="#">come on!</a></li>
- </ul>
- '''
- soup = BeautifulSoup(html)
- ret = findAll(target,soup)
- self.assertEqual(3,len(ret))
更多的见附件的Unittest。希望大家喜欢。
让CodeIgniter的URL更完美
CodeIgniter是一个轻型的PHP框架,老甘介绍我认识的,而她的作者是一位摇滚乐手兼程序员,怎么能不让我欢喜呢?嘿。
CodeIgniter推荐使用search engine友好的URL,如:/post/123 而非传统的 /post.php?id=123,当然也可以使用传统的URL,但是不作修改(或扩展)的CodeIgniter只能够两者选其一,不支持/post /123/?from=google这样的URL,其严重程度是直接报404错误,没有商量的余地。但是实际使用的时候,两者兼备的情况也不少,如果真不 支持这种URL的话,可能大多数人要选择另外的框架咯。
在网上找了下,解决方案还是有的,不过最后在我身上都失败了。最后试了下面这个办法:
一、自定义一个Input类,代码如下,以MY_Input.php为名保存到application/libraries下面。
[php]
class MY_Input extends CI_Input {
function _sanitize_globals()
{
$this->allow_get_array = TRUE;
parent::_sanitize_globals();
}
}
[/php]
二、把$config['uri_protocol'] 的值改为ORIG_PATH_INFO。
好了,现在的CodeIgniter可以兼容两种风格的URL了。。
用Prism把网络应用本地化
较早之前听说Firefox也要效仿Chrom支持多进程浏览网页了。不过凭Mozilla的底子,要实现应该是相当容易了。这不?Mozilla现在硬生生地把网络应用变成了本地应用!
Prism就是这样一个应用转换器,她可以把GMail,Greader等变成本地的应用程序,以后我不需要在浏览器中打开Gmail也可以收Email了。用Firefox实现这个太简单了,凭她强大的XUL。
先试试创建一个Reader应用。先安装Prism的Firefox插件。
打开googleReader后,展开工具菜单,点选Convert website to Application。

弹出配置窗口,并于程序界面、快捷方式和程序图标的一些设置。。为了让它看起来更像桌面程序,我就不选生成导航栏,甚至状态栏我也不要了。最后创建程序到桌面。

确定后在桌面生成一个google reader.app的应用程序,双击打开就是一个本地的Google Reader应用程序了。。界面截图如下:

此刻我想起了Adobe Air,诞生时让无数人惊艳的RIA神器,我开始知道,原来网络应用也可以变成桌面应用。
我知道Prism和Air是两款截然不同的产品,他们主要面对的用户群体也不一样,Prism对网络应用的最终用户友好,而Air是对网络应用的开发者友好,只是我想说,她们的最终目的都是为了最终客户。
Prism + Gear > Air?
不是开玩笑。Prism + Gear组合,仅需要开发一次,网络、桌面版应用均可使用,而Air只适合开发桌面应用,如桌面版的Ebay,就是用Air重新开发一套本地UI的。Prism + Gear(或其他嵌入式DB)后,Air只剩下“用户界面在本地”的优势了。
也许我不应该就Prism这么小的产品长篇大论,因为现在,桌面应用与网络应用的界限已经越来越模糊了。其实Prims只是给每个应用程序创建了一个独立进程罢了。。呵呵。
老潘祭出BFG,沈氏独门技太极
自上次在加拿大花园卢旨咖啡厅里面论Zope3至今,广州的Pythoner已较少有类似的聚会.广州Python的领军人老潘一直有心想再次组织这样的聚会,只苦于时间关系,聚会一推再推.
上上次见老潘是在一个多星期前,适逢沈仙人沈嵗空降广州,benky约我前往膜拜顶礼,得知几位的近况.
老潘此前在CPUG里面频频提过Bfg这个应用框架,并欲寻机普及,又闻everydo内部已用Bfg做出些成绩,假以时日可开源共享成果.我建议就是打铁不如趁热,事情放久了过后就没激情了,我说老潘周末举行个小聚会吧,把Bfg给大家现一现.老潘一思量就成了.此后,我约过目前在pythoncn炙手可热的赖总永浩,可惜他没时间准备Topic,可喜的是他答应前往聚会.大伙有幸一睹赖总的风采. 沈仙人这周末正打算过珠海,估计是去金山?我想,何不以群众的力量把仙人留下,顺便把金山那三位大妈拉过来呢?说实话,我极想沈仙人给大伙卖一下他的eurasia3.
滋有一间房,能容12人,今邀广州有志python行者前往聚会.topic不限,预期有:
python web 框架 BFG 简介 -- 潘俊勇
eurasia3与一式太极 -- 沈崴
时间:2009-3-1日中午11时30到下午2:30 含免费午餐.
地点:广州市员村二横路1号璟轩酒家 4楼3号VIP房.
Topic名称以届时实际情况为准.临场发起Topic也相当欢迎.
本文将同时发布在ZPUG,本人的博客,同时通过twitter,ff等渠道发布.有兴趣参加的同学请联系我或twitter上直接@jeff_jie. 本次聚会人数有限,有意者从速报名.
---------------------
Update:
由于沈仙人仙游到珠海,本次的聚会无法出席.但有闻名的"阿尔脖特.李"从珠海过来给大家讲讲Hadoop mapreduce.
再Update:
沈仙人今天早上给我电话说珠海去不成了,刘老师们忙买房呢,星期天准时参加聚会!