如何正确地从pycurl抽象化

3 投票
2 回答
929 浏览
提问于 2025-04-17 03:15

我想写一个伪模块,让人可以不断地发起GET请求(就像用来获取Twitter流媒体API那样),但不需要每次调用这个请求的函数时都输入所有参数。

在我的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)

所以我想只传入用户名、密码、密钥名称和一个“consume”函数,这个函数应该在缓冲区装满有效的JSON数据时被调用……

现在发生的情况是,请求确实被发出了,如果VERBOSE模式开启,我可以看到所有数据都在到达,但那个“更高层次的consume”函数却什么都没得到……

我该怎么做才能实现这个呢?谢谢。

2 个回答

0

我在你的帖子代码中没有看到 on_receive(self, data): 有打印任何东西。
可以在里面加上 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 = ""
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))

撰写回答