2016-11-22 5 views
1

私は現在、ツイストされたPythonライブラリを使用してhttps経由でホストされているコンテンツにアクセスする際にいくつかの問題を抱えています。私はこの図書館が新しく、欠落している概念があると仮定していますが、それは問題を引き起こしていますが、例に基づいていない可能性があります。まっすぐに、それをこのコードを実行するとき ツイストされたHTTPSクライアント

from twisted.python.log import err 
 
from twisted.web.client import Agent 
 
from twisted.internet import reactor 
 
from twisted.internet.ssl import optionsForClientTLS 
 

 
def display(response): 
 
    print("Received response") 
 
    print(response) 
 

 
def main(): 
 
    contextFactory = optionsForClientTLS(u"https://example.com/") 
 
    agent = Agent(reactor, contextFactory) 
 
    d = agent.request("GET", "https://example.com/") 
 
    d.addCallbacks(display, err) 
 
    d.addCallback(lambda ignored: reactor.stop()) 
 
    reactor.run() 
 

 
if __name__ == "__main__": 
 
    main()

SSL上で見出しHTTPの下 https://twistedmatrix.com/documents/current/web/howto/client.html

:ここ

は、私は例を集めているページへのリンクです失敗する。

Traceback (most recent call last): 
 
    File "https.py", line 19, in <module> 
 
    main() 
 
    File "https.py", line 11, in main 
 
    contextFactory = optionsForClientTLS(u"https://example.com/") 
 
    File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/internet/_sslverify.py", line 1336, in optionsForClientTLS 
 
    return ClientTLSOptions(hostname, certificateOptions.getContext()) 
 
    File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/internet/_sslverify.py", line 1198, in __init__ 
 
    self._hostnameBytes = _idnaBytes(hostname) 
 
    File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/internet/_sslverify.py", line 86, in _idnaBytes 
 
    return idna.encode(text) 
 
    File "/usr/local/lib/python2.7/dist-packages/idna/core.py", line 355, in encode 
 
    result.append(alabel(label)) 
 
    File "/usr/local/lib/python2.7/dist-packages/idna/core.py", line 276, in alabel 
 
    check_label(label) 
 
    File "/usr/local/lib/python2.7/dist-packages/idna/core.py", line 253, in check_label 
 
    raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) 
 
idna.core.InvalidCodepoint: Codepoint U+003A at position 6 of u'https://example' not allowed

このエラーが間違っていましたoptionsForClientTLSに渡されるパラメータを信じるために私を導く:私はこのようになりますエラーが発生します。完全なURLではなくホスト名が必要なので、パラメータを簡略化してexample.comに変更しました。その変更が行われると、関数は正常に完了しました。

残念なことに、変更後、スクリプトは、agent.requestを呼び出す行で失敗しました。このエラーはoptionsForClientTLSによって生成されているオブジェクトは、作成時にエージェントに渡されることが期待されているオブジェクトのタイプではないと信じて私をリード

Traceback (most recent call last): 
 
    File "https.py", line 19, in <module> 
 
    main() 
 
    File "https.py", line 13, in main 
 
    d = agent.request("GET", "https://example.com/") 
 
    File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/web/client.py", line 1596, in request 
 
    endpoint = self._getEndpoint(parsedURI) 
 
    File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/web/client.py", line 1580, in _getEndpoint 
 
    return self._endpointFactory.endpointForURI(uri) 
 
    File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/web/client.py", line 1456, in endpointForURI 
 
    uri.port) 
 
    File "/home/amaricich/.local/lib/python2.7/site-packages/twisted/web/client.py", line 982, in creatorForNetloc 
 
    context = self._webContextFactory.getContext(hostname, port) 
 
AttributeError: 'ClientTLSOptions' object has no attribute 'getContext'

:それは供給エラーは、このでした。存在しない関数が呼び出されようとしています。すべてのことを言って、私は2つの質問があります。

  1. この例は廃止予定ですか? HTTP要求をすべて魅力的にする前述の例は、間違ったことをやっているのですか?
  2. 私は、HTTPSを使用してサーバーからデータを取得する簡単な方法を探しています。このようなことを行うのが解決策ではない場合、HTTPS要求がどのようにねじれているのかをよく知っていますか?

答えて

1

はい、ドキュメントの例が間違っていることは間違いありません。私はバグwhile working w/ treqに気づいた。 v14のthis exampleに従ってください。それで、Twistedを直接使うのではなく、treqを使うべきです。重い持ち上げのほとんどがあなたのために世話をされています。あなたはtreqはあなたのためのSSLのものの面倒を見ることができるように

from __future__ import print_function 
import treq 
from twisted.internet import defer, task 
from twisted.python.log import err 

@defer.inlineCallbacks 
def display(response): 
    content = yield treq.content(response) 
    print('Content: {0}'.format(content)) 

def main(reactor): 
    d = treq.get('https://twistedmatrix.com') 
    d.addCallback(display) 
    d.addErrback(err) 
    return d 

task.react(main) 

:ここではあなたの例の簡単な変換です。 display()コールバック関数を使用すると、ヘッダー、ステータスコード、本文などのHTTP応答のさまざまなコンポーネントを抽出できます。レスポンスボディなどの単一のコンポーネントのみが必要な場合は、さらに簡略化できます。

def main(reactor): 
    d = treq.get('https://twistedmatrix.com') 
    d.addCallback(treq.content)  # get response content when available 
    d.addErrback(err) 
    d.addCallback(print) 
    return d 

task.react(main) 
+0

あなたは聖人です!手伝ってくれてどうもありがとう。Treqは素晴らしい作品で、私の仕事を続けさせてくれるでしょう。あなたは宝石であり、私はあなたとあなたがするすべてを感謝します。 – w33t

+0

私は助けることができてうれしいです:D人々がDMV領域でPython/Twistedを使用するのを聞いてうれしいです。 –

関連する問題