使用cookies与twisted.web.client

时间:2009-09-09 10:12:10

标签: python cookies twisted

我正在尝试使用扭曲的Web客户端应用程序,但在使用Cookie时遇到一些问题。有没有人有我可以看的例子?

3 个答案:

答案 0 :(得分:7)

虽然getPage不容易直接访问请求或响应标头(getPage不是超级棒API的一个例子),但实际上支持cookie。

cookies = {cookies: tosend}
d = getPage(url, cookies=cookies)
def cbPage(result):
    print 'Look at my cookies:', cookies
d.addCallback(cbPage)

字典中传递给getPage时的任何Cookie都将被发送。服务器为响应请求而设置的任何新cookie都将添加到字典中。

在查看getPage时,您可能错过了此功能,因为getPage签名在其中的任何位置都没有cookies参数!但是,它确实需要**kwargs,这就是cookies支持的方式:传递给getPage的任何额外参数,它不知道自己,它传递给{{1} }。看一下该方法的签名,看看你可以传递给HTTPClientFactory.__init__的所有内容。

答案 1 :(得分:2)

事实证明,没有简单的方法 标题存储在twisted.web.client.HTTPClientFactory中,但不能从twisted.web.client.getPage()获取,这是为撤回网页而设计的功能。我最终改写了这个函数:

from twisted.web import client

def getPage(url, contextFactory=None, *args, **kwargs):
    fact = client._makeGetterFactory(
        url,
        HTTPClientFactory,
        contextFactory=contextFactory,
        *args, **kwargs)
    return fact.deferred.addCallback(lambda data: (data, fact.response_headers))

答案 2 :(得分:1)

from twisted.internet import reactor
from twisted.web import client

def getPage(url, contextFactory=None, *args, **kwargs):
    return client._makeGetterFactory(
        url,
        CustomHTTPClientFactory,
        contextFactory=contextFactory,
        *args, **kwargs).deferred

class CustomHTTPClientFactory(client.HTTPClientFactory):

    def __init__(self,url, method='GET', postdata=None, headers=None,
                 agent="Twisted PageGetter", timeout=0, cookies=None,
                 followRedirect=1, redirectLimit=20):
        client.HTTPClientFactory.__init__(self, url, method, postdata,
                                          headers, agent, timeout, cookies,
                                          followRedirect, redirectLimit)

    def page(self, page):
        if self.waiting:
            self.waiting = 0
            res = {}
            res['page'] = page
            res['headers'] = self.response_headers
            res['cookies'] = self.cookies
            self.deferred.callback(res)

if __name__ == '__main__':
    def cback(result):
        for k in result:
            print k, '==>', result[k]
        reactor.stop()

    def eback(error):
        print error.getTraceback()
        reactor.stop()

    d = getPage('http://example.com', agent='example web client', 
                 cookies={ 'some' : 'cookie' } )
    d.addCallback(cback)
    d.addErrback(eback)

    reactor.run()