折腾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"吧,不知道有没优惠,我当时注册就苦于没有找到推荐码,全价购买。

Django1.0阿尔法发布
真是一个振奋人心的消息,Django终于要结束三年以上的版本长跑,出1.0版了.苦了社区里面的朋友,一直在苦苦等待.
这次发布的直接原因估计是前段时间Django易主,由新的基金会支持Django的发展.
本站是基于django开发D,当时的版本还是0.96,大概在去年9月份上的线,等到1.0正式版出来,马上就升级啦!
期待Django的正式版早日发布,期待更多的朋友加入django的行列.