我正在尝试使用扭曲的Web客户端应用程序,但在使用Cookie时遇到一些问题。有没有人有我可以看的例子?
答案 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()