Stonelee's Blog

如无必要,勿增实体

Orbited中最好不要使用demjson,会导致twisted报错

分享到: 更多

Orbited是一个非常好用的推(comet)服务器,它内置了twisted作为异步服务器,集成了MorbidQ来作为消息队列服务器,对于服务端直接推数据到客户端的应用参考 这篇文档就可以了。

实际编码中问题来了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class DataProducer(StompClientFactory):
    def recv_connected(self, msg):
        print 'Connected; producing data'
        self.timer = LoopingCall(self.send_data)
        self.timer.start(1)

    def recv_message(self,msg):
        pass

    def send_data(self):
        data = {'type':'num', 'num':random()}
        self.send(CHANNEL_NAME, json.encode(data))

def main():
    reactor.connectTCP('localhost', 61613, DataProducer())
    reactor.run()

执行程序的话会报错:

1
TypeError:Data must not be unicode

看twisted源码:

1
2
if isinstance(data, unicode): # no, really, I mean it
    raise TypeError("Data must not be unicode")

看注释的意思,好像作者非常强调这个类型啊,不让改就不改呗

再看orbited.json源码: 提供了cjson、simplejson、demjson的调用

在我本机上实际上调用的是demjson,它序列化的对象是unicode类型的,而我常用的json.dumps()返回的对象是str类型,符合twisted的需要,因此直接使用后者即可。

关于这个bug我已经 提交了,Orbited开发者很活跃,应该很快就会有回应。

Comments