fcgi.py 从python2.x到3.x的移植

来源:互联网 发布:深圳国际学校知乎 编辑:程序博客网 时间:2024/05/18 00:24

      python推出3.x版本已经有很长一段时间了,许多第三方模块却都还没有开始完全支持3.x版本。一直奇怪为什么第三方py模块的更新速度这么慢,今天我终于真正体会了一把。

出于对py标准化组织的信任,我决定以后做事情都用python3来搞,因此在做一个web框架时,考虑到从fastcgi+ngnix来搭建。但是      django使用的fcgi.py文件并不支持python3.x。没办法,决定自己移植。

      由于fcgi.py文件并不大,因此早晨的时候踌躇满志,以为能够三下五除二将移植工作搞定。调整了几个小的地方,如函数的新名字、变更后的所属模块后,运行python fcgi.py,程序能够正常运行。但是就是无法获得ngnix甩过来的流量,后来通过跟踪源码,发现是py3.x中str和bytes两种数据类型要求更严格所产生的异常导致,做了显示转换后,问题解决。fcgi.py能够获得流量了,但是新的问题出来了,网页送过来的客户端信息数据被粘连在一块,没有被fcgi正确解析,这个问题很好定位,ngnix通过socket方式将客户端参数组包后send给fcgi,fcgi在解析这些信息时,用struct模块的unpack函数进行解析,但是由于unpack函数中str、bytes以及字符长度等问题的交叉缠绕,这种大调整正是python3.x显著不同于python2.x的地方,此类问题集中在fcgi.py的decode_pair函数中,重写了这个函数后,问题解决。

     至此,移植过程结束,算下来,花去了我13个小时的时间。收获就是,对ngnix+fastcgi的原理有了一些了解。