Water's profileMerlinBlogLists Tools Help

开源项目的领导者说,Django框架可以让python开发者用更快的速度、更少的代码创建web应用。
实际上,Django框架素以“期限之内做到完美”而著称,这源于其创立者们在一次新闻网站开发中,达到的效果远远超出初期目标——让新闻记者们按时完成任务。

Django的首席开发人员, (自己也是一名记者),Adrian Holovaty曾说: “我们花了几年时间搞定了一个完美的框架,它可以让我们迅速创建超强的数据库web站点”。

观察家们认为,Django为python开发者提供了类似于Ruby on Rails为ruby开发者所做到的事情——方便、迅捷的web开发能力。

一位观察家说,实际上,如果Ruby on Rails加速了基于ruby的web开发,那么Django可被视为“python on a plane”。

(下面是一段Django由来的介绍)

Django originated when Holovaty was working at the World Online, the online arm of the Lawrence Journal-World newspaper in Lawrence, Kan. In the fall of 2003, Holovaty and a colleague, Simon Willison, decided against using the PHP language and began using Python to develop World Online's sites. They soon created a framework to help the organization turn out Web applications under deadline pressure. Sometimes they only had a matter of hours between coming up with the concept for an application and the time it was publicly launched, Holovaty said.

Then, in July of last year, World Online open-sourced the software that became known as Django, he said.

华盛顿邮报的Holovaty解释了为什么决定将Django开源的想法:“ the initial purpose for Django was "to automate the repetitive stuff and make it fun and easy to build database-driven Web sites. We decided to open-source it for a variety of reasons, including getting development help and bug fixes from programmers around the world and marketing our commercial news CMS [content management system] product, Ellington.”

从中可以看出,第一,Django是先有商业实践再开源的,比较稳定和安全;第二,这些人力推底层的开源Django,也是为了推销他们的商业产品CMS系统——Ellington。

在8月份最近的一次SciPy盛会上,python的创造者,Guido van Rossum发表了一个keynote演说,宣称Django是其最喜欢的web开发框架。

后来,Rossum在给eWEEK的一封电子邮件中说:"I was pressed to pick one framework—which I think is actually a silly thing—and I reconfirmed my preference for Django." (呵呵,很有意思)

What Van Rossum says he meant by the pronouncement at SciPy is, "Simply that if I were to need a Web framework today, I'd use Django unless it was clear that Django isn't right for the task.

当然Rossum作为python教父,一举一动都受到广大人民的严密监视,他在迫于压力的情况下做了选择,不过为了不得罪非Django势力,立刻作了解释为什么选择Django。

"I don't do a lot of Web programming, and the Web programming that I do isn't very complex, so I'm not sure that my vote should count very strongly," he added. "But people keep asking me to pick one, and I like Django because I like the way its authors run their project: They really 'get' open-source development."

接下来Django的各位开发者粉墨登场,纷纷表达对教主垂青的感慨。

Of Van Rossum's pronouncement, Jacob Kaplan-Moss, one of Django's core developers, said in a blog post: "Obviously this makes me pretty damn happy. I'm sure this will help people trying to choose a Web framework to come to Django, and I think they'll like what they find. Personally, I think Django's the best tool to develop Web sites—but of course I think that."

Holovaty said he and the core group of Django developers "chose Python because we'd fallen in love with its beauty, elegant syntax and power. Python is like poetry."

The plan for Django is to continue improving it, with its worldwide community of users and developers, Holovaty said.

"Our goal is to solve the real-world problems that Web developers face every day, and to make it fun to build Web sites," he said. "We're hoping to reach Version 1.0 toward the end of the summer, and we're working on a Django book to be released in the fall."  

和Ruby On Rails比怎么样?Holovaty吹嘘说,Django的抽象层次比较高。(当然,仁者见仁,智者见智)

And while Django can be compared to frameworks like Ruby on Rails and other Python Web frameworks, "something that makes Django different from similar projects—such as Ruby on Rails—is our interest in abstracting things to a very high level, automating large chunks of Web development," Holovaty said.

显然,admin这个feature在不同场合被不同人士经常强调,看来是人心所向。

For example, Django can automatically create an "administration" Web site, saving developers days to weeks of mundane development, Holovaty said. "We've got some other examples of high-level automation coming down the road, within the next few weeks."

In addition to being a boost on the development side of things, Django is also quite scalable, Holovaty said. Django is designed to take advantage of as much hardware as you can throw at it, he said.

Moreover, Django "uses a 'shared-nothing' architecture, which means you can add hardware at any level—database servers, caching servers or Web application servers," said an FAQ on the Django site.

Holovaty, who plays guitar, said he named the Web framework after Django Reinhardt, a jazz guitarist from the 1930s to the early 1950s. Django is pronounced "Jang-oh," he said.

Being a journalist who programs is a "nice niche," Holovaty said. "And, boy, does the journalism industry need help in this department," he added.

In an interview with the Online Journalism Review, Holovaty said of his dual role: "The main value in understanding programming is the advantage of knowing what's possible, in terms of both data analysis and data presentation. It helps one think of journalism beyond the plain (and kind of boring) format of the news story."

这一点很关键,Holovaty说,程序帮了记者三件事情:收集信息、过滤信息以及表述信息。

Indeed, programming helps to automate what Holovaty said are the three basic tasks of journalists: gathering information, distilling information and presenting information.

"'Doing journalism through computer programming' is just a different way of accomplishing these goals," Holovaty said in the OJR interview. "Namely, the technique favors automation wherever possible."

看来,Django的开发者们在做完第一个新闻网站之后,顺带成功搞定了一批新闻网站,想必在新闻媒体网站业内口碑甚好。

Among the sites that use Django are lawrence.com, a local-entertainment site for Lawrence, Kan.; chicagocrime.org, a freely browsable database of crimes reported in Chicago; LJWorld.com, the web site of the Lawrence Journal-World newspaper; washingtonpost.com, the Washington Post's Web site and collection of Web database applications; Tabblo, a photo-sharing site; Toronto Life, the Web site of Toronto's city magazine; and lawrencechamber.com, the Web site of the Lawrence Chamber of Commerce.

 
September 17

Django搭配mod_python

对于上线的django系统,官方推荐的方式是apache带mod_python。

应该是和mod_perl差不多,apache启动的时候就把python代码load到内存中,这些代码将誓与服务器进程共存亡,这样据说可以极大地提高性能。Django需要apache 2.x和mod_python 3.x,你还必须使用apache的prefork MPM。

基本配置:
- 编辑httpd.conf文件
<Location "/mysite/">
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
PythonDebug On
</Location>

这将告诉apache,对于所有/mysite/下的URL,请给我使用mod_python。Apache会将DJANGO_SETTINGS_MODULE的值传递给mod_python,这样mod_python会知道该使用哪一个settings。
注意应该把PythonDebug选项关掉,在上线系统中出现问题时,用户会看到你那些丑陋的python trackback。。。
还有一点,用mod_python部署了django之后,每次修改了代码,就不得不重启apache。


下面谈谈一个apache中怎么搞多个django:
很简单,如同虚拟主机那样:
NameVirtualHost *
<VirtualHost *>
ServerName www.example.com
# ...
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
</VirtualHost>
<VirtualHost *>
ServerName www2.example.com
# ...
SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings
</VirtualHost>

关于media文件:
Django并不会自己去搞media文件,这些都留给了外层的web服务器。
官方推荐的做法是,用独立的web服务器来做(比如lighttpd、TUX 、A stripped-down version of Apache ——说句实话,我还不是很清楚他的意思)。
不过,如果没有选择,当然可以就用apache的这个虚拟主机来搞media文件:

<Location "/media/">
SetHandler None
</Location>

官方给出的下面这个例子中,django被设在根上,而且显式关掉django解析media子目录以及jpg/png/gif文件:
<Location "/">
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
</Location>

<Location "media">
SetHandler None
</Location>

<LocationMatch "\.(jpg|gif|png)$">
SetHandler None
</LocationMatch>

关于admin files
别忘了admin下面的media文件,虽然开发的时候感觉不到,其实也需要我们手工搞定的。
admin的media文件在这里:django/contrib/admin/media
官方文档推荐两种做法:
在你的目录下创建一个到admin media文件的符号链接,这样所有的东西呆在一个地方,而且你还可以进行svn update。
或者干脆一古脑全部拷贝一份到你的apache指定的site目录下去。

关于出错处理
需要注意:mod_python中出现的错误,不会被报到apache的error_log文件中。

如果。。。遇到恐怖的segmentation fault:
如果Apache出现了segmentation fault,有两种原因, 但是和Django都没有关系.
可能是因为你的python代码正在importing "pyexpat" module, 这个模块可能会和Apache自带的版本冲突. 更多信息可参见Expat Causing Apache Crash.
还有一种可能是你在一个apache中同时运行了mod_python和mod_php, 并且使用MySQL作为后台数据库。在某些情况下,由于PHP和python的MySQL的backend会发生冲突,从而导致mod_python的一个问题,详情参阅 mod_python FAQ entry.

如果mod_python仍然出现问题,最简便的方法就是先掐了django,再看看一个barebones的mod_python是否正常工作。这里 Getting mod_python Working有详细方法。

(以上文字摘录并翻译自Django官方文档——Using Django with mod_python

September 16

十年砍柴

近日还读了两本谭伯牛的书,《战天京》/《天下残局》,不是赶潮流,真的好看!帖别好看!!!在此郑重推荐,听我话绝不会后悔:-)

猜猜看,为什么题目是“十年砍柴”?

女雕刻家

在当当买了一批书,其中有Minette Walters的《毒舌钩》、《女雕刻家》,可惜成名作《冰屋》缺货。这位美女作家凭着这三部小说,三年中囊括英美两地所有侦探、推理小说的最高大奖,以至于变成缺席了二三十年来好不容易出现的推理小说女王。不得了,不得了,被评论为有资格接替阿加莎克里斯蒂的人啊,正如我们很难想象还能出现接替金庸的武侠小说家一样。

一口气看完了《女雕刻家》,略微有点点失望,也许胃口被吊得太高,也许期望太多,也许被福尔摩斯、波洛之流浸淫得太久,现代小说太容易流于光怪陆离的暴力和性,尤其是国外的这些小说,特别容易陷入描写我们八辈子都碰不上的稀奇之事、古怪之人。《女雕刻家》也不例外,同性恋、15岁少女堕胎、暗杀、两个离婚之人的恋情、精神病患者、修女、牧师、百折不挠的女作家。。。我们只能想象这些东西,这些东西在生活中实在是太罕见,以至于我们只能坐在那里抽象地空想以获取“阅读经验”,再加上翻译之后的中文犹如蒸馏过的纯净水,虽然很纯,可是也过滤了有益的各种各样的矿物质,我们已经部分失去英美人士读原版小说的“乐趣”,那些遗失在字里行间的味道、那些精致的双关语、那些前面部分残留到后面所引起的隐约回想,统统消失在简单追求结局之中。

Anyway,书还是很好看的。

September 07

偶像之一:韩东

《有关大雁塔》

有关大雁塔
我们又能知道些什么
有很多人从远方赶来
为了爬上去
做一次英雄
也有的还来做第二次
或者更多
那些不得意的人们
那些发福的人们
统统爬上去
做一做英雄
然后下来
走进这条大街
转眼不见了
也有有种的往下跳
在台阶上开一朵红花
那就真的成了英雄
当代英雄
有关大雁塔
我们又能知道什么
我们爬上去
看看四周的风景
然后再下来

 

所谓诗人们,其实我没有几个崇拜的。也许是经验没有他们老到,体验没有他们深刻。但是我有我自己的准则,无须借助他人的标准作参考。韩东是我为数不多的真正觉得“有货”,或者说比较对路子的“诗人”。这首大雁塔,当年名噪一时,确实耐读。时至今日,仍然爱不释手。也许,所描述的这种坦率、冷漠的心情,今天更能有体会。对暗示的历史感、文化感的故意疏离,对淡漠心境的孤傲之意,故意冷眼旁观式的调侃,聊大天式而不经意透出的大智慧,给与参读者贴心的享受。
末了那四句:

有关大雁塔
我们又能知道什么
我们爬上去
看看四周的风景
然后再下来

真是令人无限惆怅,无限神往。。。

摘一段偶像的简历:

韩东,1961年生于南京。第三代重要诗人。八岁随父母下放苏北农村,1982年毕业于山东大学哲学系,在校期间开始诗歌创作。毕业后在西安、南京等地高校任马列主义教员,1992年夏天辞职。1985年起主编《他们》文学杂志一至九期。八十年代中期,发表《有关大雁塔》《你见过大海》等诗作,提出“诗到语言为止”观点,引起诗坛的争议。现居南京,为自由撰稿人。

一个马列主义教员,成长为中国急具影响力的“先锋诗人”和作家,他的内心世界究竟是怎样的呢?我很好奇,但也清楚认识到我这辈子基本不可能有机会当面问问偶像了,虽然他在南京——我的老巢。作为一个幼年就下放到农村的知识青年,乡村生活留下了怎样的印记呢?回想我6、7岁时在苏北农村的模模糊糊的残缺记忆,似乎也有些东西似曾相识,就算并无真正的“同感”,姑且装作有所体会吧。

 

《温柔的部分》

我有过寂寞的乡村生活
它形成了我生活中温柔的部分
每当厌倦的情绪来临
就会有一阵风为我解脱
至少我不那么无知
我知道粮食的由来
你看我怎样把清贫的日子过到底
并能从中体会到快乐
而早出晚归的习惯
捡起来还会象锄头那样顺手
只是我再也不能收获些什么
不能重复其中每一个细小的动作
这里永远怀有某种真实的悲哀
就象农民痛哭自己的庄稼

 

而这首《温柔的部分》,则更加实际一些,纯粹的个人体验,令人遐想万千,余味十足。那种看似十分随意、冷漠的风格,其实是建立在极端精致、极端锤炼的语言功力之上。慢慢的读,仔细地读,乡村长大后出来的人恐怕更有体会一些。这种淡淡的、却又隐隐约约略为深沉的感情,带着一丝不易察觉的悲哀之情,真的耐读,很耐读。

很久以前还有一首《在早晨睡去》,亦很精彩,属于陈年旧芝麻,就不剽窃了。

ps:今天当当网送书到公司,其中一本《诗词例话》,一本《中国新诗》,有人看到,围过来大呼小叫,似乎发现了新大陆,又或者发现了怪物。害我做了亏心事一样,偷偷摸摸收拾好书,唯恐更多人发现我这不良的读书嗜好。

September 04

转一篇柴静的博客文章——椅子上的KTV

原文在这儿: 椅子上的KTV

 

火上的锅咕嘟咕嘟开着。

大师傅用手把土豆和血块捋到锅里,再伸出同一只手收钱。

这样的地方能生意好,除了味道,大概是因为还可以唱卡拉OK。

其实就是台彩电,当街一放,接了一个话筒。

吃十块钱的麻辣烫就可以免费唱一首。

我去的时候,有个大姐刚吃着羊肉串唱完《两只蝴蝶》。

接下来是个小伙计。

裸着上身,瘦精精,蹲在椅子上。

画面是BEYONG的演唱会,盗版盗得画面都是抖的。前奏的钢琴声根本听不清楚。

“今天我,寒夜里看雪飘过,怀着冷透了的心窝飘远方…”

咦,他的粤语真标准,广东人?

“风雨里追赶…”可能是他刻意学黄家驹的发音吧,听上去象是哽咽。

大师傅高声喊“靠街那桌好了啊来拿”

那边人骂骂咧咧地“你他妈不会送一下啊这么两步”

大师傅转向那个椅子上的小伙子“喂,你去送一下”

他蹲在那把椅子上,头也没回。

“多少次,迎着冷眼与嘲笑,从没有放弃过心中的理想…”

不知道是谁,忽然把啤酒瓶捶在桌上。“嘿哥们不错”

“原谅我这一生不羁放纵爱自由,哪会怕有一天会跌倒…”

他唱得那么用力,跟我一桌的人都停下说话看着他。

但他靠着椅子,背影木然而柔顺的样子,不知道他那么大的声音是哪儿来的。

歌到了和声部分,男人的和音带着电吉它和贝司的声音,一下卷过来,连破电视的滋啦声都盖住了。

然后不知道为什么,就那么一会儿,坐在满地狼籍里的人,被啤酒瓶和汤汤汁汁包围着的人,很多人,男人和女人,就一块唱起来了。

“背弃了理想,谁人都可以,哪会怕有一天只你共我…”

包括我。

 

有点感动,专业记者的眼光很敏锐。
(观察柴静的文字,在中国做一个好记者真的很难)

September 03

How to read the Django documentation

微软的daily build越来越显示出深远的影响力,django也不例外,先进的生产力手段总是立刻会流行起来。就像django的代码一样,django的文档也是在daily basis上持续发展的,用SVN进行版本控制,每个独立的文件描述一个专门的主题。文档在SVN中的位置是:

django/trunk/docs

当然,web版文档的地址是http://www.djangoproject.com/documentation/

一个有趣的问题是,SVN中的文档是plain text,如何自动生成web版的格式化的文档?django采取的做法是,每隔15分钟自动从svn中的plain text去生成HTML页面。(看,tool chain又出现了)

web版文档的一个关键特性是,每个文档底部有一个comment section。任何人都可以加上自己对这份文档的建议、修改,这样django的开发者们可以及时看到这些意见,然后体现到文档中。django鼓励大家提出意见,充分体现了开源软件开发模式的特色,当然如果你觉得还不够,还可以加入邮件列表进行讨论——django-users mailing list

任何时候我们想获取最新的plain text文档,可以用svn update命令:

svn co http://code.djangoproject.com/svn/django/trunk/docs/ django_docs
cd django_docs
svn update

这样做的理由是很多习惯在linux下工作的人喜欢用grep命令去搜索自己需要的东西。当然,我们也可以在本地重新生成web页面以便浏览,方法和django服务器的做法一样:

djangoproject.com/django_website/apps/docs/parts/build_documentation.py

这个脚本可以转换plain text到HTML页面,所有django的plain text文档都遵循一种称为ReST(ReStuctured Text)的格式,这使得我们很方便的进行文本转换。(是不是想起了XSLT?)

还有一些琐碎的东西,比如文档版本的维护问题,代码特定版本发布的时候如何保持和文档的inline问题,在此不再赘述。

从另一个角度看,这样的项目开发组织方式,颇有些XP的味道,稍微复杂一点、大一点的项目可不可以这样做?这套方法可不可以用到我们平时的项目管理中?

September 01

merge、merge、merge

身处电信界最大的merge行动之一,每天被无数rumor环绕,耳闻目睹无数权力斗争上演,最近的生活很紧张,很刺激,很精彩。

alcatel、lucent、nortel、fujitsu,想必对中兴、华为会形成巨大的挤压,在巨头的尔虞我诈中,国内制造商们相必更要进一步发挥“床垫”文化了。

摘录

GTD的理念:GTD的核心理念在于只有将你心中所想的所有的事情都写下来并且安排好下一步的计划,你才能够心无挂念,全力以赴地做好目前的工作,提高效率。而当你总是有些事萦绕在心头,悬而未决的时候,你要么就是会不时地想起它而影响现在的工作,要么就是会忘记了去做。而GTD通过将所有的这些事都罗列出来再进行分类,确定下一步的处理方法,将所有这些悬而未决之事都纳入我们可控制的一个管理体系中。

GTD的基本方法:GTD的具体做法可以分成收集、整理、组织、回顾与行动五个步骤。

  • 收集:就是将你能够想到的所有的未尽事宜(GTD中称为stuff)统统罗列出来,放入inbox中,这个inbox既可以是用来放置各种实物的实际的文件夹或者篮子,也需要有用来记录各种事项的纸张或PDA。收集的关键在于把一切赶出你的大脑,记录下所有的工作
  • 整理:将stuff放入inbox之后,就需要定期或不定期地进行整理,清空inbox。将这些stuff按是否可以付诸行动进行区分整理,对于不能付诸行动的内容,可以进一步分为参考资料、日后可能需要处理以及垃圾几类,而对可行动的内容再考虑是否可在两分钟内完成,如果可以则立即行动完成它,如果不行对下一步行动进行组织
  • 组织:个人感觉组织是GTD中的最核心的步骤,组织主要分成对参考资料的组织与对下一步行动的组织。对参考资料的组织主要就是一个文档管理系统,而对下一步行动的组织则一般可分为:下一步行动清单,等待清单和未来/某天清单。等待清单主要是记录那些委派他人去做的工作,未来/某天清单则是记录延迟处理且没有具体的完成日期的未来计划、电子等等。而下一步清单则是具体的下一步工作,而且如果一个项目涉及到多步骤的工作,那么需要将其细化成具体的工作。GTD对下一步清单的处理与一般的to-do list最大的不同在于,它作了进一步的细化,比如按照地点(电脑旁、办公室、电话旁、加利、超市)分别记录只有在这些地方才可以执行的行动,而当你到这些地点后也就能够一目了然地知道应该做那些工作
  • 回顾:回顾也是GTD中的一个重要步骤,一般需要每周进行回顾与检查,通过回顾及检查你的所有清单并进行更新,可以确保GTD系统的运作,而且在回顾的同时可能还需要进行未来一周的计划工作
  • 执行:现在你可以按照每份清单开始行动了,在具体行动中可能会需要根据所处的环境,时间的多少,精力情况以及重要性来选择清单以及清单上的事项来行动

    下面这幅流程图清晰地说明了GTD的方法与流程。
    workflow diagram

    GTD的工具:GTD 的工具既可以是PDA也可以是最普通的纸和笔。在PDA中有许多GTD的软件,比如PPC系统的Listpro、Informant,Palm系统的 Datebook,Lifebalance等等。如果没有PDA也没关系,已经有很多Blogger发明出了许多方便地使用纸和笔进行GTD的工具,比如这个Hipster PDA等等,在电脑上也有许多可以在GTD上使用的工具,比如GTDTiddlyWiki这个网页汇集了在电脑上使用的主要GTD工具。

  •  

    Blog


      September 26

      读书两种

      坚持步行上班一月有余,减去赘肉6斤,真觉双腿飘飘,继续、继续。

      从前急吼吼赶着上班,节奏很快,没发现慢慢走颇有乐趣。今早路过一中学,听得娃娃们大声朗读语文课本,心下疑惑,这许多年过去,怎么还是这种读书样子?

      从前我小时候早读课,老是困惑一件事情,就是不知道怎么读那些课文?既要大声,又要不累,还要能坚持半小时,想想真是奇迹。总结下来,大概有两种读法记忆深刻:一是无聊读法,就是一般采用的平白无表情机械型,这个不用仔细描述也能想象;还有一种比较有意思,有那么一些同学,喜欢读得特别“抑扬顿挫”,而且要做“饱含深情”状,不用说,早就厌恶我们白板读法的老师尤其偏好这种读法,因为这给老师带来了不一样的新鲜的“教学多样性”,我心下甚恶之,因为听上去太假。根本不管哪里该弱、哪里才该强,哪里该快,哪里又宜缓缓图之,完全凭着性子忽悠,仔细听还能听到急促的呼吸声。。。

      后来长大了,慢慢知道朗诵是很有技巧的,也听过不少名人的演说录音(中外皆有),觉得那时老师若能拨乱反正、指我等一条光明大道,我现下不至于碌碌无为、庸人一条了,不然最起码人生乐趣的发掘会提前不少时光。

      公司一女同事曾曰,混了这么多年、跑过这么多地方、读了那么多现代书,到头来反而觉得老祖宗那些旧货味道香、耐看。当时这话令我眼头一亮,这尔虞我诈、倾轧成堆的地方偶尔也能听到一两句真言。(此才女亦是南理工毕业,居然是94级电子系的)

      古人教育子女“苦读”、“死读”,恐怕也出于这样一种心态:“现在你小子不懂,只管给我苦读,将来有一天你总会明白我一片苦心”。回头想想,还真觉得自己小时候古文学少了、学差了,以至于开始胡思乱想将来如何如何灌输我儿这方面的情操。。。

      事实一:木木将有小木木;

      事实二:老殷已有女儿一名,随母亲姓,名曰“玥”;

      事实三:乱拱的梦想之一是讲童话给他一对龙凤胎儿女听;

      。。。

      NND,思路和键盘手一起漂移、跑题,回到题目,还要反思一下自己:酸气十足,其实题目应该叫做“两种读书”,仔细看看,味道还是有些区别的。

      September 21

      Django搭配FastCGI

      又翻译了一篇文档

      How to use Django with FastCGI

      尽管目前推荐的运行Django的方法是使用Apache加上mod_python,但是很多人使用了shared hosting,如此只能用FastCGI。某些情形下,FastCGI拥有更好的安全性——并且,可能比mod_python具有更好的性能。

      本质上,FastCGI是一种让web服务器之外的独立程序提供页面的方法。Web服务器把受到的web请求通过socket委托给FastCGI,后者执行代码并返回结果给web服务器,然后服务器将结果返回给用户的浏览器。
      如同mod_python一样,FastCGI也是把代码load到内存中,这样在对请求进行响应时将没有启动延时。但是和mod_python(或者mod_perl)不一样的是,FastCGI进程不是运行在web服务器之内,而是独立的进程。

      为何它要自己一个人玩?

      Apache经典的mod_*参数,用来内嵌各种各样的脚本支持(比如PHP,Python和Perl),但是这些都是在web服务器的进程空间之内的。尽管这样节省了启动时间——代码处理无须I/O操作,但是消耗了内存。以mod_python为例,每个apache进程都有自己的python解释器,这会占用大量内存。

      根据FastCGI的天性,甚至允许运行非web服务器帐号的用户进程。这带来了额外的安全好处,因为你可以将你的代码与其他用户隔离开来。

      前提条件:flup
      在玩转Django搭配FastCGI之前,你必须安装flup,这是处理FastCGI的一个python库。请确保使用最新的SVN版本:-)

      启动你的FastCGI服务器

      FastCGI以client-server的模式进行工作,大部分情况下,你自行启动FastCGI进程。你的web服务器(可以是apache,lighttpd,或者别的什么)仅仅在需要载入动态页面的时候才去联系你的Django-FastCGI进程。因为它已经在内存中待命,所以处理响应的速度是非常快的。

      注意

      如果你玩的是共享主机系统,你可能被强制以web服务器管理的方式使用FastCGI进程。往下看,如何处理这种情形。
      Web服务器有两种和你的FastCGI服务器发生联系的方法:要么通过Unix域套接字(windows上则是命名管道),要么直接通过TCP套接字。哪一种更好无所谓,取决于个人口味;只不过出于权限考虑,TCP套接字方法更为简单一些。

      启动你的服务器之前,先到你的project目录下(也就是manage.py文件所在的那个目录啦),运行:

      ./manage.py runfcgi [options]
      

      当然你可以用help选项来看看帮助信息。 当然,你需要指定一个socket或者主机加端口,这才能开搞。然后设置web服务器以完成启动FastCGI服务器。举例如下:  

      在指定的TCP端口上运行一个threaded服务器:
      ./manage.py runfcgi method=threaded host=127.0.0.1 port=3033
      在指定的Unix域套接字上运行preforked服务器:
      ./manage.py runfcgi method=prefork socket=/home/user/mysite.sock pidfile=django.pid

      以非daemon方式运行一个进程(便于调试):
      ./manage.py runfcgi daemonize=false socket=/tmp/mysite.sock

      终止FastCGI daemon:
      如果是放在前台运行,显然很简单:直接Ctrl-C之;如果是后台,也很显然:kill之。

      如果启动的时候指定了pidfile选项,则可以这样kill之:
      kill `cat $PIDFILE`

      下面的shell脚本可以很方便地重起FastCGI:

      #!/bin/bash
      # Replace these three settings.
      PROJDIR="/home/user/myproject"
      PIDFILE="$PROJDIR/mysite.pid"
      SOCKET="$PROJDIR/mysite.sock"
      
      cd $PROJDIR
      if [ -f $PIDFILE ]; then
          kill `cat -- $PIDFILE`
          rm -f -- $PIDFILE
      fi
      exec /usr/bin/env - \
        PYTHONPATH="../python:.." \
        ./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE
      

      Apache的配置

      当然,我们肯定需要配置了mod_fastcgi的apache。在此不再赘述,参见apache的有关文档。
      通过编辑httpd.conf文件来让apache指向Django的FastCGI实例,你需要做如下两件事情:

      • 使用FastCGIExternalServer directive来指明FastCGI server的位置
      • 使用mod_rewrite来适当指明FastCGI上的URLs
      关于指明FastCGI server的位置:

      FastCGIExternalServer directive告诉 Apache 如何去找到你的FastCGI server。这里 FastCGIExternalServer docs 解释了,你可以选择指定一个套接字或者主机。这里是一些例子:

      # 通过socket / named pipe来连接Connect to FastCGI
      FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock
      # 通过TCP host/port来连接FastCGI
      FastCGIExternalServer /home/user/public_html/mysite.fcgi -host 127.0.0.1:3033

      无论哪种情况,/home/user/public_html/mysite.fcgi 这个文件无须存在。 这只不过是web服务器内部使用的一个URL而已—— 用来指明FastCGI必须处理哪一个URL的一个钩子(下面细谈)。

      用 mod_rewrite 指明FastCGI上的URLs

      第二步是让apache知道对于特定的模式匹配的URLs该交给FastCGI。为此,使用 mod_rewrite 模块并且重写 URLs 到 mysite.fcgi (或者任何你在FastCGIExternalServer directive中指明的东西,正如上面一节解释的那样)。

      下面的例子中,我们告诉apache,对于所有非文件存取并且不以/media/打头的请求,就让FastCGI去处理。如果我们在Django中使用admin这个feature的话,这可能是最普通的情况:

      <VirtualHost 12.34.56.78>
        ServerName example.com
        DocumentRoot /home/user/public_html
        Alias /media /home/user/python/django/contrib/admin/media
        RewriteEngine On
        RewriteRule ^/(media.*)$ /$1 [QSA,L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
      </VirtualHost>

      lighttpd 配置

      lighttpd是一个轻量级的web服务器,通常用来存取静态文件。它天生支持FastCGI,因此,如果你对apache没有特别要求的话,这是个很好的选择,不管是静态页面还是动态页面。
      确保 mod_fastcgi 已经安装,在 mod_rewrite 和 mod_access之后的某个地方,但是不要在 mod_accesslog之后。你可能还需要 mod_alias,以便支持 admin media。

      在你的lighttpd 配置文件中加入下面这些:

      server.document-root = "/home/user/public_html"
      fastcgi.server = (
          "/mysite.fcgi" => (
              "main" => (
                  # Use host / port instead of socket for TCP fastcgi
                  # "host" => "127.0.0.1",
                  # "port" => 3033,
                  "socket" => "/home/user/mysite.sock",
                  "check-local" => "disable",
              )
          ),
      )
      alias.url = (
          "/media/" => "/home/user/django/contrib/admin/media/",
      )

      url.rewrite-once = (
          "^(/media.*)$" => "$1",
          "^/favicon\.ico$" => "/media/favicon.ico",
          "^(/.*)$" => "/mysite.fcgi$1",
      )

      在一个lighttpd中运行多个Django站点:

      lighttpd 用 "conditional configuration" 来支持主机级的定制配置。为了配置多个FastCGI站点,只需在FastCGI配置文件中为每个站点加上下面的conditional block :

      # If the hostname is 'www.example1.com'...

      $HTTP["host"] == "www.example1.com" {

         server.document-root = "/foo/site1"

          fastcgi.server = (

             ...

          )

          ...

      }

      # If the hostname is 'www.example2.com'...

      $HTTP["host"] == "www.example2.com" {

          server.document-root = "/foo/site2"

          fastcgi.server = (

             ...

          )

          ...

      }

      你也可以通过在fastcgi.server directive中指定多个entry来支持同一个站点上的多个Django 安装,还有为每个Django加上一个FAstCGI主机。

      在Apache的共享主机中运行Django :

      一般情况下,共享主机业主不允许你运行自己的服务器进程,也不允许你编辑httpd.conf配置文件。这时,对于Web server-spawned processes仍然可以运行Django。

      注意事项

      如果你遇到的是 Web server-spawned processes的情况,并不需要自己去启动FastCGI服务器。Apache 会根据情况衍生出一堆进程以满足需要。

      在你的Web根目录下,加一个文件: .htaccess

      AddHandler fastcgi-script .fcgi
      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^(.*)$ mysite.fcgi/$1 [QSA,L]
      

      然后,创建一个小脚本告诉Apache如何spawn 你的FastCGI程序。创建一个 mysite.fcgi 文件并且放到你的web目录下,确保其有执行权限。

      #!/usr/bin/python
      import sys, os
      # Add a custom Python path.
      sys.path.insert(0, "/home/user/python")
      # Switch to the directory of your project. (Optional.)
      # os.chdir("/home/user/myproject")
      # Set the DJANGO_SETTINGS_MODULE environment variable.
      os.environ['DJANGO_SETTINGS_MODULE'] = "myproject.settings"
      from django.core.servers.fastcgi import runfastcgi
      runfastcgi(method="threaded", daemonize="false")
      
      重起spawned server

      如果你改变了任何python代码,你就需要告诉FastCGI已经动了代码。但是没有必要重起apache。相反,你只需上传mysite.fcgi文件,或者编辑它一下,让这个文件的时间戳变一下。这样当apache看到这个文件更新过了,他会主动去重起你的Django程序。

      如果你有权限在Unix系统上玩到shell,用下面这条简单的touch命令就可以做到:
      touch mysite.fcgi

      September 20

      转:牛校牛在哪儿

      我在哈佛做一年博士后,这一年,除了领钱,基本也没有什么别的任务。为了防止自己整天缩在家里,把薄薄的那一沓钱翻来覆去地数,我决定去旁听几门课。
      那天我去学校我所在的机构,跟机构里的秘书表达了此意。她非常干脆地说,没问题啊,只要教授同意,都可以呀。我问,有没有一个什么社科方面的课程清单,我看看有什么课可选。我问的时候,想象的是几页纸,可以站那顺手翻完。结果说时迟那时快,柔弱的女秘书突然掏出一个庞然大物,向我递过来,我伸手一接,胳膊差点因为不堪重负而当场脱臼。
      定睛一看,这本1000多页的玩意的封面上,赫然印着几行字:
      Courses of Instruction 2006-2007
      Harvard University.
      Faculty of Arts and Sciences.
      Harvard College
      Graduate School of Arts and Sciens.
      就是说,仅仅就本科和文理学院的课程表及课程的简单介绍(一般3-5行的介绍),哈佛就一口气列了1000多页。我估计,把哈佛全校的课程名单一一排列出来,是不是得绕上赤道一周两周啊。
      以前在哥大听课,我就觉得自己已经见过世面了。现在,捧着这个庞然大物,我有种金轮法王突然路遇萧峰的悲凉感,过去六年建立起来的牛校感当即化作片片飞屑,随风而逝。
      端着它回到自己的办公室,仔细研读起来。如同一个饥饿无比的人,捧着一个写满了各种山珍海味的菜单,边咽着口水边往下读。读到最后,就是《廊桥遗梦》里面女主角遇上男主角的感觉,之前和丈夫风平浪静的婚姻,原来都是不算数的,这才是真正伟大的爱情。
      当然,让我产生伟大爱情的,不仅仅是哈佛所提供的课程之多,更重要的,是它所提供的课程之人性化。
      国内的媒体,时不时地就会把“大学精神”这个话题拿出来讨论一下。基本上大家都会达成一个共识:大学不是职业培训机构,大学精神不应当仅仅是训练工作技能的精神。据说,大学应该熏陶的,是一种人文精神。
      虽然“人文”这两个字,因为靠“文人”两个字太近,已经臭大街了,我觉得,大家还是应该再给它一次机会。
      哈佛大学之所以是一流的大学,当然是因为它最有钱,然后用这些钱买了最先进的设备和雇了最牛的教授。但是同时,也是因为它蕴含了丰富的人文精神,而这一精神,最集中地体现在它的“核心课程”上(哥大也有,但是跟哈佛比,是小巫见大巫)。
      所谓“核心课程”,就是学校提供给本科生的一系列基础课,学生必须从中选出几门作为必修课。这些基础课的目的,是让学生在进入知识的细枝末节之前,能够对他所置身的世界有一个框架性的理解和探索。这样当他置身于自己的专业时,能够知道自己所学习的,不过是一个巨大有机体里面的一个毛细血管。
      摘抄一段关于“核心课程”的说明: “The philosophy of
      the Core Curriculum rests on the conviction that every Harvard graduate
      should be broadly educated, as well as trained in a particular academic
      specialty or concentration. It assumes that students need some guidance
      in achieving this goal, and that the faculty has an obligation to
      direct them toward the knowledge, intellectual skills, and habits of
      thought that are the hallmarks of educated men and women.”
      哈佛的“核心课程”分成七个板块:Foreign Cultures;
      Historical Study; Literature and Arts; Moral Reasoning; Quantitative
      Reasoning; Science; Social Analysis. 拿Moral
      Reasoning这个板块做为例子,所给的课程包括:
      1。民主与平等
      2。正义
      3。国际关系与伦理
      4。伦理学中的基本问题
      5。儒家人文主义
      6。有神论与道德观念
      7。自我,自由与存在
      8。西方政治思想中的奴隶制
      9。社会反抗的道德基础
      10。共和政府的理论与实践
      11。比较宗教论理
      12。传统中国的伦理和政治理论
      13。古代与中世纪政治哲学史
      14。现代政治哲学史
      拿科学这个板块来说,所给课程包括:
      1。光与物质的性质
      2。空气
      3。宇宙中的物质
      4。观察太阳与恒星
      5。时间
      6。爱因斯坦革命
      7。环境的风险与灾难
      8。现实中的物理
      9。Cosmic connections
      10. 音乐和声音的物理学
      11。看不见的世界:科技与公共政策
      12。能源、环境与工业发展
      13。Life as a Planetary Phenomenon
      其它的板块,就不列了,太长。基本上,“核心课程”的目的,就是让学生们在开始研究树木之前,能够先看一眼森林。最好能够把这个森林地图印在大脑上,以后走到再细小的道路上,也不会迷路。
      我再列一些“本科新生研讨会”的课程(freshman
      seminar)――这个freshman
      seminar是什么宗旨,什么来头,我不大清楚,但是有些课程名称开得非常诱人,因为名单太长,我只列上那些我感兴趣的课程――也就是如果我有三头六臂会去旁听的课程。
      1。人的进化
      2。翅膀的进化
      3。细菌的历史
      4。银河与宇宙
      5。象棋与数学
      6。疾病的话语
      7。DNA简史
      8。美国的儿童医疗卫生政策
      9。应然:道德判断的本质
      10。火星上的水
      11。医药公司与全球健康
      12。传染病对历史的影响
      13。非洲的艾滋病
      14。关于意识的科学研究
      15。什么是大学,它的目的是什么?
      16。俄罗斯小说中的爱情
      17。怀疑主义与知识
      18。一个社区的研究
      19。基督教与美
      20。怎样欣赏画
      21。浮士德
      22。黑人作家笔下的白人
      23。香蕉的文化历史
      24。乌托邦与反乌托邦
      25。苏格拉底及其批评者
      26。怎样读中国的诗歌
      27。互联网与法律
      28。美国的70年代
      29。The American Creed: Exceptionalism and Nationalism.
      30。语言与政治
      31。信任与民主
      32。美国的总统选举
      33。60年代的青春文化
      34。盗版
      35。全球变暖与公共政策
      36。当代印度
      37。公共健康与不平等
      38。公墓的历史
      39。人权
      40。政治演讲与美国的民主
      41。“犯罪”的概念
      42。现代欧洲国家的民族主义
      43。烟草的历史
      44。酷刑与现代法律
      45。大脑的测量:心理学实验的兴起
      你看,随便这么一列,就有45个。对于一个求知欲很强的人来说,这些课程简直就是一场饕餮之宴,举着筷子,不知从何下手。
      不知道清华北大,能给那些刚刚背井离乡的18岁孩子,开出上述45门课中的几门。
      我相信,大学精神的本质,并不是为了让我们变得深奥,而恰恰是恢复人类的天真。
      天真的人,才会无穷无尽地追问关于这个世界的道理。关于自然、关于社会。大学要造就的,正是达尔文的天真。爱因斯坦的天真。黑格尔的天真。顾准的天真。也就是那些“成熟的人”不屑一顾的“呆子气”。
      “成熟的人”永远是在告诉你:存在的就是合理的,而合理的就是不必追究的,不必改变的。
      真正的人文教育,是引领一群孩童,突破由事务主义引起的短视,来到星空之下,整个世界,政治、经济、文化、历史、数学、物理、生物、心理,象星星一样在深蓝的天空中闪耀,大人们手把手地告诉儿童,那个星叫什么星,它离我们有多远,它又为什么在那里。
      前两天读王璐小友的文章,其中有句话说的挺好玩,说到国内某现象,他说:两个连大学都算不上的什么机构,竟然为自己还算不算一流大学而辩得脸红脖子粗。
      这事我没怎么跟踪,所以也不太清楚。好像是香港几个大学挖了几个高考状元走,清华北大就开始捶胸顿足,觉得自己不再“一流”。这种捶胸顿足有点滑稽,仿佛宋祖德为自己不再是一线男星而痛心疾首。其实,清华北大的确应该捶胸顿足,但不该是为了几个高考状元,而应当是为自己与天真的距离。

      September 19

      Python on a plane

      eWEEK上的一片小文,翻来看看。
       
      Django: Python on a Plane
       
      By Darryl K. Taft
      August 29, 2006