承認済みホストのプロキシを介してXmlRPCを使用する

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)



  1. Copy Source | Copy HTML serverURL = "http://some.server.com/xmlrpc" xmlTransport= UrllibTransport() server = xmlrpclib .ServerProxy(serverURL, transport = xmlTransport)



  2. Copy Source | Copy HTML serverURL = "http://some.server.com/xmlrpc" xmlTransport= UrllibTransport() server = xmlrpclib .ServerProxy(serverURL, transport = xmlTransport)



  3. Copy Source | Copy HTML serverURL = "http://some.server.com/xmlrpc" xmlTransport= UrllibTransport() server = xmlrpclib .ServerProxy(serverURL, transport = xmlTransport)











トランスポートスクリプト自体:



Copy Source | Copy HTML



  1. #-*-コーディング:utf8-*-
  2. #python-ntlm(http://code.google.com/p/python-ntlm/)パッケージが必要
  3. ntlm import HTTPNtlmAuthHandler から
  4. sys、os、tempfile、pickleのインポート
  5. xmlrpclib、getpass、stringをインポート
  6. base64、urllib2、cookielibのインポート
  7. urllib から 、unquote、splittype、splithost、getproxiesをインポートします
  8. urllib2をインポート
  9. #######################################
  10. useProxy = True
  11. useAuthOnProxy = True
  12. proxyUser = "ユーザー名"
  13. proxyPassword = "パスワード"
  14. proxyServer = "http://proxy.org {128 "
  15. httpAuthName = "user"
  16. httpAuthPassword = "パスワード"
  17. serverTopLevelURL = "http://my.server.com"
  18. #######################################
  19. クラス UrllibTransportxmlrpclib .Transport):
  20. def request (self、host、handler、request_body、verbose = 0 ):
  21. self .verbose =詳細
  22. useProxyの場合
  23. useAuthOnProxyの場合
  24. self .proxyurl = "http://" + proxyUser + ":" \
  25. + proxyPassword + "@" \
  26. + proxyServer [ 7 :]
  27. その他
  28. self .proxyurl = proxyServer
  29. その他
  30. self .proxyurl =なし
  31. puser_pass =なし
  32. self .proxyurl None でない 場合
  33. タイプ、r_type = splittype( self .proxyurl)
  34. phost、XXX = splithost(r_type)
  35. phostの「@」の 場合
  36. user_pass、phost = phost.split( '@'1
  37. user_passの「:」の 場合
  38. ユーザー、パスワード= user_pass.split( ':'1
  39. puser_pass = base64 .encodestring(
  40. '%s:%s' %(引用符なし(ユーザー)、引用符なし(パスワード)))strip()
  41. プロキシ= { 'http''http://%s' %phost}
  42. host = unquote(ホスト)
  43. address = "http://%s%s" %(ホスト、ハンドラー)
  44. request = urllib2 .Request(アドレス)
  45. request .add_data(request_body)
  46. request .add_header( 'User-agent'self .user_agent)
  47. request .add_header( "Content-Type""text / xml"
  48. #HTTP認証
  49. password_mgr = urllib2 .HTTPPasswordMgrWithDefaultRealm()
  50. top_level_url = serverTopLevelURL
  51. password_mgr.add_password(なし、
  52. top_level_url、
  53. httpAuthName、
  54. httpAuthPassword)
  55. handler = urllib2 .HTTPBasicAuthHandler(password_mgr)
  56. #クッキー
  57. cj = cookielib .CookieJar()
  58. puser_passの場合
  59. #NTLM
  60. passman = urllib2 .HTTPPasswordMgrWithDefaultRealm()
  61. passman.add_password(なし、serverTopLevelURL、ユーザー、パスワード)
  62. authNTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(パスマン)
  63. request .add_header( 'Proxy-authorization''Basic' + puser_pass)
  64. proxy_support = urllib2 .ProxyHandler(プロキシ)
  65. opener = urllib2 .build_opener(handler、proxy_support、
  66. urllib2 .HTTPCookieProcessor(cj)、
  67. authNTLM)
  68. elif self .proxyurl:
  69. #認証なしのプロキシ
  70. proxy_support = urllib2 .ProxyHandler(プロキシ)
  71. opener = urllib2 .build_opener(proxy_support、
  72. ハンドラー
  73. urllib2 .HTTPCookieProcessor(cj))
  74. その他
  75. #直接接続
  76. proxy_support = urllib2 .ProxyHandler({})
  77. opener = urllib2 .build_opener(proxy_support、
  78. ハンドラー
  79. urllib2 .HTTPCookieProcessor(cj))
  80. urllib2 .install_opener(オープナー)
  81. response = urllib2 .urlopen( request
  82. return self .parse_response(応答)




PS

urllib2に興味がある人は、 urllib2-The Missing Manual-を使って作業する機能、特にエラーと例外処理の詳細を説明した優れたドキュメントを参照することをお勧めします。



All Articles