Category Archives: Python

[翻译]Go 和 Python 的 Web 服务器性能对比

原文在此:http://ziutek.github.com/web_bench/

由于是早上看到 鱼哥,在推上的推荐,我实在忍不住……这是中午的草率之举,所以 鱼哥 对本文的翻译负全责。

PS:别说我工作状态不饱满,我在等丫的程序执行完……

————翻译分割线————

Go 和 Python Web 服务器性能对比

我通常使用 Python 来构建 Web 应用。一年前,在兴趣的驱使下,我开始学习 Go。 在此期间,我重写了一些原本由 C 开发的 CGI 应用,包括运行于 chroot 环境下的同 thttpd 服务器一起的应用。我开始寻找可以开发易于 chroot、且内置 Web 服务器的独立 Web 应用的工具。那时,我开始玩 web.go 框架、mustache.go 模板、Go 原生 http 包和 GoMySQL 数据库 API。我发现,有 http、mustache.go  GoMySQL 包的 Go 可以是我用来工作的不错的工具组合。因此,我决定使用 Go 编写我的应用。
Continue reading [翻译]Go 和 Python 的 Web 服务器性能对比

python 自身的协程实现?

本来,想给这个随笔起个更眩的名字:《跟随赖神学协程——之一》,原因嘛,自然是因为赖神的协程三篇之一(协程初接触)。不过,怕赖神k我,所以标题党还是朴素一点吧。

至于标题里的问号,是我有意加上去的。原因是在推上赖神认为“python 语言和标准库是不支持协程的(3.x部分支持)”,并且如果 python 自身支持协程,“stackless py 该有多么惭愧啊, :)”(stackless python 的协程详情请看这里)。但是因为 PEP 0342 的描述,令我很迷惑。python 自身是否可以实现协程,这个值得商榷。我不确定,保守点好,给自己个后路走。加个问号吧……如果这不算协程,大家就当我实现了“伪协程”吧。嘿嘿…… Continue reading python 自身的协程实现?

Twisted 的 MemcacheProtocol 使用

Twisted 的 defer 是个强大但是诡异的东西,遗憾的是,除了官方文档和这些文档的翻译,其他资料不多。而基于 defer 的客户端协议实现资料就更少了。Memcache 的协议实现也是利用 defer,但是除了一个单元测试的代码外,很难看到其他可以参考的实现。搞了几天,总算是有一个简单的封装,可以避开 defer,无须让所有参与开发的技术人员一定要弄懂 defer 才能用 MemCacheProtocol。
上代码吧,这样封装,应该是比较好理解的…… Continue reading Twisted 的 MemcacheProtocol 使用

Netbeans Python 调试,郁闷的包导入问题

这几天在帮忙开发一个 python 项目。使用 netbeans 的时候,遇到一个诡异的问题。

如果使用“运行”来跑项目,一切正常。而如果使用“调试”来跑项目,当执行到 import 第三方的库的时候,就会产生“ImportError: No module named xxxx”。郁闷不已,上网查了半天,没找到可用的信息。

毛主席教育我们“自己动手,丰衣足食”。于是就祭出“观察、归纳和总结”的科学的研究方法,对这个灵异现象进行了一番探索。 Continue reading Netbeans Python 调试,郁闷的包导入问题

脚本语言的配置文件

关于配置文件,在 PHP 的 Zend Framework 中我做过一些简单的关于性能的测试:http://www.mikespook.com/index.php/archives/36。将 ninnypro 的配置文件从 ini 修改为 xml ,并且声称能提高传说中的性能。

最近被调到另外一个在用 python 的组帮忙,阅读了他们的实现服务器端的 python 代码之,配置文件近二十余个,全是 xml 文件。为了使用着些配置文件,从 XMLFile 继承,实现了二十余个 Config 类。

这看起来似乎没什么问题。 Continue reading 脚本语言的配置文件

Django 1.0.2 mod_python 方式报 TypeError 的解决方法

尝试用 Django 写了一个简单的企业站,部署过程中出了不少问题,不过还好都一一解决了。

“激动不已”的看到了首页,长出一口气:“总不会再出什么其他问题了吧!”随手点了一个内部链接:
—————————————————

TypeError at about

'NoneType' object is not iterable

—————————————————
这回可晕倒了,怎么会有这样一个错误?
接着往下看,发现错误是由于丢失了一个反斜线引起的:

Request Method: GET
Request URL: http://www.i-fang.comabout
Exception Type: TypeError
Exception Value:
'NoneType' object is not iterable
Exception Location: /usr/lib/python2.5/site-packages/django/core/handlers/base.py in get_response, line 77
Python Executable: /usr/bin/python
Python Version: 2.5.2
Python Path: [‘/home/www/www.i-fang.com/’, ‘/usr/lib/python25.zip’, ‘/usr/lib/python2.5’, ‘/usr/lib/python2.5/plat-linux2’, ‘/usr/lib/python2.5/lib-tk’, ‘/usr/lib/python2.5/lib-dynload’, ‘/usr/local/lib/python2.5/site-packages’, ‘/usr/lib/python2.5/site-packages’, ‘/var/lib/python-support/python2.5’]
Server time: Tue, 5 May 2009 10:25:17 +0800

在 Request URL 中域名和路径中间的反斜线丢失了。
是 urls.py 配置的问题?检查、试验……不是!
是 apache 配置的问题?检查、试验……还不是!
所有的内容跟 Django 手册上的完全一致,到底是怎么回事呢?
看到这个邮件列表的内容,才明白,有时手册是不能随便抄的:
—————————————————
Take a look at the django.root PythonOption described here:

http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from…

Are you using that option? If, yes, remove that option entirely and
try again.
—————————————————

去掉了 apache 配置文件中的“PythonOption django.root /”,重启 apache 后,一切访问正常了。

TurboGears 学习笔记-控制器

这部分内容虽然不多,但是看了好多天。

在 tgadmin 自动生成的 appname/appname/controller.py 中有如下代码:

1 import turbogears as tg
2 from turbogears import controllers, expose, flash
3 from cherrypy import request
4 # from sandbox import model
5 # import logging
6 # log = logging.getLogger(“sandbox.controllers”)
7
8 class Root(controllers.RootController):
9 @expose(template=sandbox.templates.welcome)
10 def index(self):
11 import time
12 # log.debug(“Happy TurboGears Controller Responding For Duty”)
13 flash(Your application is now running)
14 return dict(now=time.ctime())

Root.index 是 http://127.0.0.1:8080/index 的控制器。如果需要添加新的“页面”,只要在 Root 中添加新的方法即可:

16 @expose()
17 def foobar(self):
18 return Just another page

@expose() 是一定要加的,不加这个,无法定位控制器的方法。

我这里没有添加 template,所以框架将返回的内容直接作为字符串输出在页面上了。

如果想使用模板(默认为Kid),则指定模板名称 template=”appname.appname.foobar”,这个对应的是项目根开始的目录和模板文件名的结构。实际模板应保存在 appname/appname/foobar.kid 文件中。

控制器通过 expose 出来的方法的参数获得浏览器传递过来的变量,对上面的方法稍加改造即可:

16 @expose()
17 def foobar(self, *args, **kv):
18 if (kv.has_key(name)):
19 name = kv[name]
20 else:
21 name = unknown
22 return Your name is + name

当访问 http://127.0.0.1:8080/foobar 时,页面显示 Your name is unknown。当访问 http://127.0.0.1:8080/foobar?name=fool 时,页面显示 Your name is fool。

当提供一个名为 default 的方法 expose 时,所有未定义的访问都会转到这个方法上去。这时,args 参数包含了访问所用的名字。例如访问 http://127.0.0.1:8080/barfoo,而 barfoo 未定义,那么default 方法被调用。同时 args[0] = “barfoo“。

好像控制器最基本的使用就这么些东西了,有点类似 Zend Framework 的 Controller->Action 的形式,仅仅是形式。

TurboGears 学习笔记-安装

Zope3 很强大,但是一直徘徊在 python 2.4 不升级。学习的兴趣骤减。Django 版本一直停滞在 0.96 不前。据说 12 月会出 1.0,但是兼容性似乎不能保障。偶然的机会看到一篇 TurboGears 的文章,似乎停简单。于是乎,先学安装。

TurboGears 的安装已经简单到了及至:easy_install turbogears。

在 ubuntu 下使用 easy_install 这个命令需要安装 python-setuptools 这个包。

在终端中执行 tg-admin 这个命令,一切正常,除了会有一个警告:UserWarning: Your installation of Python doesn’t have a profile module.原来还需要安装 python-profiler 这个包,使用 apt-get 安装之后,这个警告就不会再出现了。

使用 tg-admin quickstart 生成一个项目,比如 sandbox。进入自动生成的 sandbox 目录,执行命令 ./start-sandbox.py 一切 OK,只要 8080 端口没有被占用,TurboGears 就正常启动了。

在开发模式下,如果需要修改 8080 端口,找到 dev.cfg 文件中的 #server.socket_port=8080 行,去掉注释,修改端口,重新执行 ./start-sandbox.py 即可。

TurboGears 所具有的美感是 zend framework 所不具备的。连安装和部署都这么简单。希望 zend framework 能够取其之长,至少提供几个实用的自动化工具也好啊。