Как правильно абстрагироваться от pycurl - PullRequest
3 голосов
/ 28 сентября 2011

Я хотел бы написать псевдомодуль, который заставляет делать запрос GET, который продолжает выполняться (почти как тот, который использует API потоковой передачи Twitter), но при этом не нужно указывать все параметры каждый раз, когда кто-то хочет вызвать функция для выполнения того же запроса 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 и функцию «потребление», которые должны вызываться, когда буфер заполнен действительными данными JSON ...

Что происходит, так это то, что запрос фактически выполняется, если включен VERBOSE, я вижу все поступающие данные, но функция get "потребляет более высокий уровень" get is ничто ...

Как мне этого добиться? Спасибо.

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Как я понимаю, вы хотите архивировать данные отладки?

Создайте свою пользовательскую функцию отладки для хранения ваших данных: 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))
0 голосов
/ 31 октября 2013

Я не смог увидеть в вашем почтовом коде, что on_receive (self, data): напечатать что-нибудь.
Добавьте к этому sys.stderr.write ("% s \ n"% данных)

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 = ""
...