首页  »  编程

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上去看看。

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哦,很多现在流行的应用或框架都可以容易地安装或部署。如果你看了觉得心动,那么,加入我们的队伍吧。

给博客增加文章归档功能

编程 jeff  |  2009-10-11 0 pythondjango博客

博客怎能没有归档功能,长假后的第一个短假,我为自己的博客加上了归档的功能。本来用Django嘛,博客归档使用Generiv View来实现是最简单不过了,不过我这个是多用户博客系统,Generic View在这时没能帮上忙,只有自己动手了。

最终博客归档的效图果如下(左图),参考了blogger的归档风格(右图),可折叠查看博客内所有文章,归档粒度去到月份。

   archive-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 代码
 
  1. from BTSelector import findAll  
  2. soup = BeautifulSoup(htmlContent)  
  3. nodes = findAll('div.navigator #notice',soup)  
  4. # findAll返回的是符合选择条件的Dom 对象列表,实际上是BeautifulSoup的标签或字符类。  

用testCase作为使用示例:
一、上一个复杂一点的用例:

python 代码
 
  1. def testMixSelection(self):  
  2. target = "#header > div#name > a.highlight"  
  3. html = ''' 
  4. <div id="header"> 
  5. <div id="name"> 
  6. <a>test</a> 
  7. <a>right</a> 
  8. <a>ok</a> 
  9. </div> 
  10. <div id="your"> 
  11. </div> 
  12. </div> 
  13. <div id="body">fk 
  14. </div> 
  15. '''  
  16. soup = BeautifulSoup(html)  
  17. ret = findAll(target,soup)  
  18. self.assertEqual(2,len(ret))  

二、再上一个使用位置操作符的用例:

python 代码
 
  1. def testPosition(self):  
  2. target = "h2 + ul > li > a"  
  3. html = ''' 
  4. <h2>title</h2> 
  5. <ul> 
  6. <li><a href="#">nothing</a></li> 
  7. <li><a href="#">ok</a></li> 
  8. <li><a href="#">come on!</a></li> 
  9. </ul> 
  10. '''  
  11. soup = BeautifulSoup(html)  
  12. ret = findAll(target,soup)  
  13. self.assertEqual(3,len(ret))  

更多的见附件的Unittest。希望大家喜欢。

让CodeIgniter的URL更完美

编程 jeff  |  2009-06-23 1 phpcodeigniterurl

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。

picture-5

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

picture-6

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

picture-8

此刻我想起了Adobe Air,诞生时让无数人惊艳的RIA神器,我开始知道,原来网络应用也可以变成桌面应用。

我知道Prism和Air是两款截然不同的产品,他们主要面对的用户群体也不一样,Prism对网络应用的最终用户友好,而Air是对网络应用的开发者友好,只是我想说,她们的最终目的都是为了最终客户。

Prism + Gear > Air?

不是开玩笑。Prism + Gear组合,仅需要开发一次,网络、桌面版应用均可使用,而Air只适合开发桌面应用,如桌面版的Ebay,就是用Air重新开发一套本地UI的。Prism + Gear(或其他嵌入式DB)后,Air只剩下“用户界面在本地”的优势了。

也许我不应该就Prism这么小的产品长篇大论,因为现在,桌面应用与网络应用的界限已经越来越模糊了。其实Prims只是给每个应用程序创建了一个独立进程罢了。。呵呵。

老潘祭出BFG,沈氏独门技太极

编程 jeff  |  2009-02-27 2 pythoncpug聚会

自上次在加拿大花园卢旨咖啡厅里面论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:

沈仙人今天早上给我电话说珠海去不成了,刘老师们忙买房呢,星期天准时参加聚会!

Meta

关于本博客...

关于黑莓手机、apple、twitter、互联网、web2.0以及生活的碎言碎语。请在twitter上 follow我,欢迎同好者talk to me bbmyth AT gmail.com。博客Hosting在 webfaction。

赞助商链接

我看我听我读

最新评论

标签

python 空间 开发 计划 年假 工作 诗歌 音乐 西片 恐怖 惊变 django mysql rss 文艺片 太阳 彩色 电影 apache 部署 factcgi lighttpd javascript editor MYMeditor sql 日志 java hibernate orm 数据库 英伦 摇滚 原创 中间件 朋友 erlang 并发 函数式编程 旅游 云南 丽江 发呆 学习 编程 技术 lucene 全文搜索 中文分词 乐队 模板 分页 成功 google pagerank 中文 更新 个性化 秋天 互联网 web ext json ajax 事业 职业 读书 开源 香港 澳门 忧郁 冬天 compass dvd 广州 地下 暴力 美学 声音玩具 独立 备份 数据 琐事 博客 生活 体验 卖唱 接口 设计模式 图表 wiki moin 遇窃 air ria 需求 设计 信息 健康 感悟 人生 真诚 life jquery 杭州 灾害 2008 中国 灾难 哀悼日 jmesa grails flex flash 捐赠 scrum 软件过程 快速开发 plone cms nuexo zope 左小诅咒 demo prototpye AMF actionscript 汉诺塔 算法 递归 结婚 感情 opensource 网络 beautifulSoup 管理 大理 香格里拉 休假 鼻炎 许巍 感性 2009 随想 cpug 聚会 出差 北京 api 创业 商城 blackberry 手机 TD 交流 处事 为人 房子 经济 手机仿真 在线服务 嵌入式 海鲜 p2p easymule apple 技巧 thing gtd task gfw vpn 穿墙 代理 软件管理 翻译 mac 英语 caffeine 休眠 搬家 主机 prism firefox mozilla 免费 php codeigniter url blogspot mindmap mindnode htmlparse easyurl 产品 黑莓 rim 试手机 豆瓣 twitter 微博 杂记 时空 亲人 dabr webfaction host 快速查看 safari appale 桌面 snow 升级 leopard finder 权限 glims python主机 合租 ruby主机 快捷键 itunes 时间管理 原型 画图 招聘 hosting 写作 软件 家庭 广州技术沙龙 postgres 云计算 fuckgfw 内容审检 谷歌 chrome linux odbc database freetds R 统计 书签 浏览器 bookmark tinymce 文件管理 分享 忙碌 旅行 马来西亚 图维导图 freemind 工具 pinax develope shell dropbox barcamp

日志分类

友情链接

博客归档

PowerBy