Python 2.Xについて話していることをすぐに予約してください。
タスク:Pythonの
xmlrpclibを 、基本認証とNTLM認証を備えたプロキシサーバー、および認証とCookieを必要とするホストを介して動作させる。
これは、アプリケーションのバグレポートシステムに必要でした。このシステムでは、エラーメッセージを
TRACに送信するときに、説明、ログなどのチケットを作成する必要があります。 TRACとの通信は、xmlRPCを介して行われます(
XmlRpcPluginを使用)。 アプリケーションユーザーは、主に企業ネットワーク内のプロキシサーバーの背後で作業します。
これは、プロキシサーバーを介してXML要求をリダイレクトする
urllibに基づくトランスポートを作成することで
実現されます。
インターネットでは、
最初のurllibに書かれた、
許可なしのプロキシサポート
の例が
いくつか見つかります。 最初はそのような例を取り上げて承認を追加しようとしましたが、最終的には
urllib2で書き直した方がはるかに簡単であることが
明らかになりました。
このトランスポートオプションは、プロキシサーバーなしの操作もサポートします(直接接続が利用できるが、指定されたプロキシサーバーが利用できない場合、接続は直接行われます-これはurllib2の機能です)。
NTLM認証をサポートするには、
python-ntlmが使用されます。
念のために、コードは例としてのみ提示されており、必要に応じてテストと変更が必須であることを警告します。
使用例:
Copy Source | Copy HTML serverURL = "http://some.server.com/xmlrpc" xmlTransport= UrllibTransport() server = xmlrpclib .ServerProxy(serverURL, transport = xmlTransport)
Copy Source | Copy HTML serverURL = "http://some.server.com/xmlrpc" xmlTransport= UrllibTransport() server = xmlrpclib .ServerProxy(serverURL, transport = xmlTransport)
Copy Source | Copy HTML serverURL = "http://some.server.com/xmlrpc" xmlTransport= UrllibTransport() server = xmlrpclib .ServerProxy(serverURL, transport = xmlTransport)
Copy Source | Copy HTML serverURL = "http://some.server.com/xmlrpc" xmlTransport= UrllibTransport() server = xmlrpclib .ServerProxy(serverURL, transport = xmlTransport)
トランスポートスクリプト自体:
Copy Source | Copy HTML
- #-*-コーディング:utf8-*-
- #python-ntlm(http://code.google.com/p/python-ntlm/)パッケージが必要
- ntlm import HTTPNtlmAuthHandler から
- sys、os、tempfile、pickleのインポート
- xmlrpclib、getpass、stringをインポート
- base64、urllib2、cookielibのインポート
- urllib から 、unquote、splittype、splithost、getproxiesをインポートします
- urllib2をインポート
- #######################################
- useProxy = True
- useAuthOnProxy = True
- proxyUser = "ユーザー名"
- proxyPassword = "パスワード"
- proxyServer = "http://proxy.org {128 "
- httpAuthName = "user"
- httpAuthPassword = "パスワード"
- serverTopLevelURL = "http://my.server.com"
- #######################################
- クラス UrllibTransport ( xmlrpclib .Transport):
- def request (self、host、handler、request_body、verbose = 0 ):
- self .verbose =詳細
- useProxyの場合 :
- useAuthOnProxyの場合 :
- self .proxyurl = "http://" + proxyUser + ":" \
- + proxyPassword + "@" \
- + proxyServer [ 7 :]
- その他 :
- self .proxyurl = proxyServer
- その他 :
- self .proxyurl =なし
- puser_pass =なし
- self .proxyurl が None でない 場合 :
- タイプ、r_type = splittype( self .proxyurl)
- phost、XXX = splithost(r_type)
- phostの「@」の 場合 :
- user_pass、phost = phost.split( '@' 、 1 )
- user_passの「:」の 場合 :
- ユーザー、パスワード= user_pass.split( ':' 、 1 )
- puser_pass = base64 .encodestring(
- '%s:%s' %(引用符なし(ユーザー)、引用符なし(パスワード)))strip()
- プロキシ= { 'http' : 'http://%s' %phost}
- host = unquote(ホスト)
- address = "http://%s%s" %(ホスト、ハンドラー)
- request = urllib2 .Request(アドレス)
- request .add_data(request_body)
- request .add_header( 'User-agent' 、 self .user_agent)
- request .add_header( "Content-Type" 、 "text / xml" )
- #HTTP認証
- password_mgr = urllib2 .HTTPPasswordMgrWithDefaultRealm()
- top_level_url = serverTopLevelURL
- password_mgr.add_password(なし、
- top_level_url、
- httpAuthName、
- httpAuthPassword)
- handler = urllib2 .HTTPBasicAuthHandler(password_mgr)
- #クッキー
- cj = cookielib .CookieJar()
- puser_passの場合 :
- #NTLM
- passman = urllib2 .HTTPPasswordMgrWithDefaultRealm()
- passman.add_password(なし、serverTopLevelURL、ユーザー、パスワード)
- authNTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(パスマン)
- request .add_header( 'Proxy-authorization' 、 'Basic' + puser_pass)
- proxy_support = urllib2 .ProxyHandler(プロキシ)
- opener = urllib2 .build_opener(handler、proxy_support、
- urllib2 .HTTPCookieProcessor(cj)、
- authNTLM)
- elif self .proxyurl:
- #認証なしのプロキシ
- proxy_support = urllib2 .ProxyHandler(プロキシ)
- opener = urllib2 .build_opener(proxy_support、
- ハンドラー
- urllib2 .HTTPCookieProcessor(cj))
- その他 :
- #直接接続
- proxy_support = urllib2 .ProxyHandler({})
- opener = urllib2 .build_opener(proxy_support、
- ハンドラー
- urllib2 .HTTPCookieProcessor(cj))
- urllib2 .install_opener(オープナー)
- response = urllib2 .urlopen( request )
- return self .parse_response(応答)
PS
urllib2に興味がある人は、
urllib2-The Missing Manual-を使って作業する機能、特にエラーと例外処理の詳細を
説明した優れたドキュメントを参照することをお勧めします。