我正在尝试使用扭曲的 Web 客户端应用程序,但在使用 cookie 时遇到了一些问题。有人有我可以看的例子吗?
问问题
2752 次
3 回答
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)
字典中的任何 cookie 在传递给时getPage
都会被发送。服务器为响应请求而设置的任何新 cookie 都将添加到字典中。
您可能在查看时错过了此功能,getPage
因为getPage
签名中的任何地方都没有cookies
参数!但是,它确实需要**kwargs
,这cookies
就是支持的方式:传递给它的任何额外参数getPage
,它不知道自己,它传递给HTTPClientFactory.__init__
. 查看该方法的签名以查看您可以传递给的所有内容getPage
。
于 2009-11-06T14:23:05.763 回答
2
事实证明,没有简单的方法 afaict 标头存储在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))
于 2009-09-09T13:18:38.827 回答
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()
于 2011-05-28T17:39:33.207 回答