昨晚要解决python写的客户端向web服务端提交一个较复杂的数据结构(多层的词典),原本打算在客户端把数据结构生成XML然后POST给web服务端,然后由服务端的php脚本解析XML,不过想想转为XML,再解析XML的过程,就很繁琐,头疼。后来想未必要用XML(不需要通用,却平白增加了网络传输量),可以自己定义一个格式来传送,不过,始终因为这个数据结构比较复杂,光来回转换这个过程就觉得麻烦,更不用说传送过程中出错,服务端如何校验数据正确性等细节问题了。
后来灵光一闪,想到为什么服务端不也用Python来写呢?因为Python的pickle直接可以把整个词典对象(不论多复杂)序列化,然后POST给服务端的Python脚本来反序列化,直接就可以在服务端得到这个词典对象了。于是在web服务器(nginx)上装了flup,spawn-fcgi,以及轻巧的web.py框架(尝试了一下django,感觉太庞大、复杂了,不适合这个简单应用),然后只要几行代码就搞定了(为了减小网络传输,用zlib把序列化了的对象再压缩一下):
客户端打包:
data = zlib.compress(pickle.dumps(dict))
params = urllib.urlencode({'s':data})
... # POST 数据
服务端解包:
class xxapp:
def POST(self):
data = urlparse.parse_qs(web.data())
dict = pickle.loads(zlib.decompress(data['s'][0]))
...
|