如何从pycurl中抽象出正确的方法

时间:2011-09-28 12:42:54

标签: python curl asynchronous streaming pycurl

我想编写一个伪模块,让一个人继续执行GET请求(非常类似于使用Twitter Streamming API的那个),但每次有人想要调用时都不必提供所有参数一个函数来发出相同的GET请求。

在我的module.py中我有

class viewResults():
    def __init__(self,username,password,keyname,consume):
        self.buffer = ""
        self.consume = consume
        self.conn = pycurl.Curl()  
        self.conn.setopt(pycurl.USERPWD, "%s:%s" % (username, password))  
        self.conn.setopt(pycurl.URL, "http://crowdprocess.no.de/"+keyname+"/results") 
        self.conn.setopt(pycurl.WRITEFUNCTION, self.on_receive)
    #   self.conn.setopt(pycurl.VERBOSE, 1)
    #   self.conn.setopt(pycurl.DEBUGFUNCTION, self.debug)
        self.conn.perform()

#   def debug(self,debug_type,debug_message):
#       print 'type: '+str(debug_type)+' message'+str(debug_message)

    def on_receive(self, data):  
        self.buffer += data  
        if data.endswith("\r\n") and self.buffer.strip():  
            content = json.loads(self.buffer)
            self.consume(content)
            self.buffer = ""

在index.py上我有

from module import viewResults

def consume(content):
    print content

viewResults('username','password','keyname',consume)

所以我想只传递参数username,password,keyname和“consume”函数,当缓冲区充满有效的JSON数据时应该调用它...

正在发生的是请求实际发生,如果VERBOSE打开,我可以看到所有数据到达,但“更高级别消耗”功能什么都没有...

我怎样才能做到这一点? 感谢。

2 个答案:

答案 0 :(得分:1)

据我所知,你想归档调试数据?

创建自定义调试功能以存储数据:custom_debug(debug_type, debug_msg)

>>> import human_curl as hurl
>>> import json
>>> r = hurl.get("http://crowdprocess.no.de/"+keyname+"/results"",
... debug=custom_debug, auth=('username', 'password'),)
>>> consume(json.loads(r.content))

答案 1 :(得分:0)

我在你的帖子代码中看不到 on_receive(自我,数据):打印的东西。
添加到 sys.stderr.write(“%s \ n”%data)

def on_receive(self, data):
        # -- print data to stderr --
        import sys
        sys.stderr.write("%s\n" % data)
        # -- end --
        self.buffer += data  
        if data.endswith("\r\n") and self.buffer.strip():  
            content = json.loads(self.buffer)
            self.consume(content)
            self.buffer = ""