Pinax的意义
某天在研究pypy的时候无意中看到了pinax,了解之下,觉得pinax真的很聪明,跟我正打算做的事情很像!她是一个基于Django的基础应用--我这里讲基础应用的意思是她既不是开发框架,又不是一开箱即用的成熟应用(当然你不介意那简陋的界面的话,它是开箱即用的),而是介于两者之间的东西。她集成了很多第三方的Django app,这使得她自己内置了很多SNS网站、公司内部网站所需要的基础功能,你要做一个SNS网站,拿来改改界面就好,你要做公司内网应用,拿来改改界面也行了。
初次接触时,还没有安装来研究,就屁颠屁颠地跟老潘说这是个好东西(我对云和企业内部办公系统有些想法,经常和老潘交流),老潘一看说颇有Plone的影子了。后来安装下来看了看,离plone所谓的应用服务器那个级别还差远了,pinax可以看作是一系列的Project template(项目模板)。接下来给出几种模板的应用运行时的截图,大家看看就明白了。至于更深入的探究不是今天要说的,有兴趣的同学直接试一试更有意义。

图一:basic_project,最简单的应用模板。

图二:内部应用的模板,提供了几种内部应用用到的功能,如任务、wiki等。

图三:Pinax提供的最复杂的一个应用模板,SNS应用,不少SNS网站是基于这个来开发的。
Pinax给开发者带来什么?
一、没有技术上的转变,该用Django还是使用Django那套东西。
二、提供了一套基础网页模板和Tab布局。这个虽然简单,但十分实用,要换套皮肤,把现成的扔给美工MM略作修改即可,无需从0开始。
三、Pinax提供的最复杂的应用模板是一个SNS应用,实际上是一个完全可以马上投入使用的产品。Pinax说,我们已经为您提供所有需要的,你要做的只是让你的网站看起来与众不同。
题外话:
一、Django变得越来越强大的同时也变得复杂,要全部掌握Django的内容门槛不低,但这不妨碍初学者快速上手。
二、有人说,django变得越来越像zope,但实际上django的门槛恐怕没有zope的20%吧,虽然django渐渐肥胖,但新增的很多东西都是可选的,并且是在web开发过程中必需去解决的问题。大家看到新出一个web framework很清爽简单,不过走着瞧吧,到最后,他不是整合其他第三方的基础模块就是自己继续砌砖,直到又有ORM、Template、Form、中间件、UrlRoute、I18N,I10N等等等等,大家殊途同归,区别不过是OEM或Fullstack而已。
三、Django社区很活跃,看看第三方的app就知道,以至于有人可以全使用第三方的应用(没有自己的Model)搭起一个博客,以及现在这个pinax。
四、web应用开发领域,可重用的东西太多,于是有了框架,而技术之上的业务层面,可重用的东西也有很多,例如用户、权限、流程引擎等,Django首先把这业务层面可重用的东西做了一套参考标准并放到开发框架里面来了,大善!太实用了!这也是我几年前希望为公司内部的开发框架做的事(后来遇上Django后,没太多激情在java的webframework上折腾这些了)。
折腾TinyMCE图片上传的结果
由于敬爱的DropBox同学不幸被吾裆阉割了一半(不能访问外链,还能同步),导致本博的部分重要图片被墙,无法翻墙的同学看着大叉叉心神不宁。我以前使用毕卡索来做图片服务器,后来毕卡索被墙后换了DropBox,但不幸的是DB同学由于出过不少次风头而也被切了一半,看来,图片这东西还是放在自己服务器靠谱,就算被墙也是换个域名的事,不用大量修改文章里的图片链接那么痛苦。
本博在去年更新程序的时候换了TinyMCE做为WYSIWYG编辑器,但一直没有时间做个图片上传的插件(用不起官方那个商业版的),最近决定折腾折腾。
凡事先Google,django + tinymce + image 等关键字一出,马上找到一些好东东。
首先是Django-FileBrowser,她是一个强大而美丽的文件管理器。

更多截图。
然后我顺腾摸瓜找到了Django-grappelli,她又是一套优雅实用的Django-admin样式和扩展,除了有一套优雅大方的样式,她还为Admin加入了书签和导航栏等功能,甚为实用,可移步到这里来围观围观。
这两个应用都与TinyMCE完美整合,最好两者一起使用,当然不用grappelli也无大碍。
这两个应用我都照单全收了,我在线把她们安装到我的服务器上,这样一来,我不仅解决了图片上传的问题,还收获了一套美观的样式、得到了一个实用的文件管理器。喔!上艳照。

现在发图方便了,下面我要发飚了。
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,但丢失了上件上传的功能。
- 一下子支持了一个人同时管理多个博客。
以后还会每天挤点时间出来折腾这个博客程序,但这次不会再让“强迫性不写博客症”发作了。
介绍一款虚拟主机--webFaction
博客在Johnny兄家里借宿久了,不方便,并且WordPress对评论的spamer防不胜防,刚好大郎兄在计划买主机,于是两人一拍即合,一起买了一款新主机--webFaction.
当初我们都想买VPS,国内的有rashost,他们有外国的主机,当时就心动了,准备下手。后来知道webFaction, 据说对python的用户特友好,框架安装使用方便,特别是对django,turboGear甚至是phone,zope这样的庞然大物等支持很到位, 并且价格比起Rashost要便宜,因为有了超级用户权限的SSH帐号,所以VPS就显得不是那么重要了,最后我们选择了webFaction最便宜的包,年付102美元,两人平摊,也就每人¥349一年,10G的存储空间还算不错了,比起国内一大堆很烂的主机要划算得多。
webFaction的前端使用的是Nginx,所以在处理静态资源效率很好,用户的每一个应用可以使用Apache作为第二层服务器进行微调。另外WebFaction还支持透明的横向扩展,只要你有需要。
现在我的博客就是部署在webFaction上的,速度方面大家可以自个感觉一下,我觉得还是蛮快的。
有在寻找python、ruby主机的同学考虑一下webFaction吧,注册过程中如果需要推荐码,就用我的"jeffjie"吧,不知道有没优惠,我当时注册就苦于没有找到推荐码,全价购买。
