Category: 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 编写我的应用。
    (more…)

  • python 自身的协程实现?

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

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

  • Twisted 的 MemcacheProtocol 使用

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

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

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

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

    毛主席教育我们“自己动手,丰衣足食”。于是就祭出“观察、归纳和总结”的科学的研究方法,对这个灵异现象进行了一番探索。 (more…)

  • 脚本语言的配置文件

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

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

    这看起来似乎没什么问题。 (more…)

  • 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 能够取其之长,至少提供几个实用的自动化工具也好啊。