如何正确地从pycurl抽象化
我想写一个伪模块,让人可以不断地发起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))