ツイストを使用して Web クライアント アプリケーションを作成しようとしていますが、Cookie に問題があります。誰かが私が見ることができる例を持っていますか?
3 に答える
getPage
リクエストまたはレスポンス ヘッダーへの直接アクセスを簡単に許可しないのは事実ですが (getPage
非常に優れた API ではないことを示す 1 つの例にすぎません)、Cookie は実際にサポートされています。
cookies = {cookies: tosend}
d = getPage(url, cookies=cookies)
def cbPage(result):
print 'Look at my cookies:', cookies
d.addCallback(cbPage)
に渡されたときにディクショナリ内のすべての CookiegetPage
が送信されます。リクエストに応じてサーバーが設定する新しい Cookie は、ディクショナリに追加されます。
署名のどこにもパラメーターがないgetPage
ため、見たときにこの機能を見落とした可能性があります。しかし、それは を取り、これがどのようにサポートされているかです: に渡された余分な引数は、それ自体については知らず、 に渡されます。そのメソッドのシグネチャを見て、 に渡すことができるすべてのものを確認してください。getPage
cookies
**kwargs
cookies
getPage
HTTPClientFactory.__init__
getPage
ヘッダーは 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))
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()