我正在使用httplib2从我的服务器向另一个Web服务发出请求.我们想要使用相互证书身份验证.我看到如何使用证书进行传出连接(h.set_certificate),但如何检查应答服务器使用的证书?
此票证似乎表明httplib2本身并不这样做,并且只有关于在哪里查看的模糊建议.
可能吗?我是否需要在较低级别进行攻击?
我有一个Python 2.7 GAE应用程序,它已经具有很多功能.现在我想要与Google API集成.
在我在Mac OSX上运行的IDE(PyCharm)中,我将以下行添加到我的应用程序的主程序中:
import httplib2
pass
Run Code Online (Sandbox Code Playgroud)
当我命令单击"httplib2"时,IDE 在编辑器面板中打开"httplib2-0.8-py2.7.egg/httplib2/init.py ",因此IDE显然知道httplib2在哪里.但运行应用程序,我得到标题中显示的错误.
为了进一步测试,我在上面显示的两个语句上放置了断点,然后在调试模式下运行应用程序.当它到达import语句时,我立即单击"Resume Program"图标.
然后控制台显示:
ImportError: No module named httplib2
Run Code Online (Sandbox Code Playgroud)
程序然后循环.也就是说,它不会终止,但它永远不会到达"通过"语句.
所以IDE似乎知道"httplib2"在哪里,但Python似乎并不存在.任何有关如何"导入httplib2"成功的帮助将不胜感激.谢谢.
我正在玩Python库httplib2.以下是我的代码.
import urllib.parse
import httplib2
httplib2.debuglevel = 1
http = httplib2.Http()
url = "http://login.sina.com.cn/hd/signin.php"
body = {"act": "1",
"entry": "vblog",
"password": "P@$sW0rd",
"reference": "http://vupload.you.video.sina.com.cn/u.php?m=1&cate=0",
"reg_entry": "vblog",
"remLoginName": "on",
"username": "this_is_user_name",
"x": "",
"y": ""}
headers = {"Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7",
"Accept-Encoding", "gzip,deflate",
"Accept-Language", "en-us,en;q=0.5",
"Connection", "keep-alive",
"Content-Length", "181",
"Content-Type", "application/x-www-form-urlencoded",
"Host", "login.sina.com.cn",
"Keep-Alive", "115",
"Referer", "http://login.sina.com.cn/hd/signin.php?entry=vblog&r=http%3A%2F%2Fvupload.you.video.sina.com.cn%2Fu.php%3Fm%3D1%26cate%3D0",
"User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16"}
response, content = http.request(url, 'POST', headers=headers, body=urllib.parse.urlencode(body))
Run Code Online (Sandbox Code Playgroud)
当我执行它时,我收到错误:
Microsoft Windows XP …Run Code Online (Sandbox Code Playgroud) 我有一个用JBoss编写的用Java编写的REST API.最近我们将JVM从1.6更新到1.7.这开始只引起我们连接的Python客户端的问题.间歇性地,Python客户端正在获得握手失败.我们写了一个非常简单的测试来重现问题:
import httplib2
for i in range(1,500):
print i
response, content = httplib2.Http(disable_ssl_certificate_validation=True).request('https://server.com:8443',)
Run Code Online (Sandbox Code Playgroud)
提供以下输出:
.
.
.
64
65
66
67
Traceback (most recent call last):
File "api_test/test.py", line 6, in <module>
response, content = httplib2.Http(disable_ssl_certificate_validation=True).request('https://server.com:8443/rest/solidtumor/2012/id/50d3216c092c8554b8b9f384?glossary=true&api_key=APIKEY',)
File "/home/hostovic/api_test/httplib2/__init__.py", line 1445, in request
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
File "/home/hostovic/api_test/httplib2/__init__.py", line 1197, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, headers)
File "/home/hostovic/api_test/httplib2/__init__.py", line 1133, in _conn_request
conn.connect()
File "/home/hostovic/api_test/httplib2/__init__.py", line 914, …Run Code Online (Sandbox Code Playgroud) 我的python程序使用httplib2.Http来发出http请求.一旦我需要生成一个请求,我创建一个httplib2.Http对象,以便我的程序经常创建/销毁httplib2.Http对象.
我发现由于达到最大打开文件数,我的程序很容易崩溃.检查/ proc // fd,打开套接字fds太多了.这个问题使我不得不深入研究httplib2源代码.
然后我发现,在httplib2.Http._conn_request方法中,有这样的代码:
else:
content = ""
if method == "HEAD":
conn.close()
else:
content = response.read()
response = Response(response)
if method != "HEAD":
content = _decompressContent(response, content)
break
Run Code Online (Sandbox Code Playgroud)
这表明套接字仅在http方法为HEAD时关闭.也许httplib2想要以某种方式重用套接字.但是Http类没有close()方法.这意味着当我发出Http请求时,套接字将不会关闭,直到我的进程终止.
然后我修改了代码:
else:
content = ""
if method == "HEAD":
conn.close()
else:
content = response.read()
response = Response(response)
if method != "HEAD":
content = _decompressContent(response, content)
conn.close() # I ADD THIS CLOSE
break
Run Code Online (Sandbox Code Playgroud)
在那之后,我的计划运作良好.
但我仍然很好奇,如果这是httplib2的错误,因为httplib2是一个非常古老而常见的lib.
许多python库,即使是最近编写的,也使用httplib2或套接字接口来执行网络任务.
由于它们的阻塞特性,这些显然比Twisted更容易编码,但我认为将它们与其他代码(尤其是GUI代码)集成时这是一个缺点.如果您想要可扩展性,并发性或GUI集成,同时避免多线程,那么Twisted是一个自然的选择.
所以我对这些问题的意见感兴趣:
编辑:请让我用另一种方式说出来.您是否觉得使用Twisted编写新的库代码可能会增加其采用的障碍?Twisted有明显的好处(特别是gimel所说的可移植性和可伸缩性),但是它不是一个核心python库的事实可能会被一些人认为是一个缺点.
我正在编写一个类似于此类的pythonic Web API包装器
import httplib2
import urllib
class apiWrapper:
def __init__(self):
self.http = httplib2.Http()
def _http(self, url, method, dict):
'''
Im using this wrapper arround the http object
all the time inside the class
'''
params = urllib.urlencode(dict)
response, content = self.http.request(url,params,method)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在使用该_http()方法来简化与httplib2.Http()对象的交互.这个方法经常在类中调用,我想知道与这个对象交互的最佳方法是什么:
__init__然后在调用方法时重用它_http()(如上面的代码所示)httplib2.Http()为方法的每次调用在_http()方法内创建对象(如下面的代码示例所示)import httplib2
import urllib
class apiWrapper:
def __init__(self):
def _http(self, url, method, dict):
'''Im using this wrapper …Run Code Online (Sandbox Code Playgroud) 您可能已经意识到,HTTP服务器通常会发送的不仅仅是session_id cookie; 但是,httplib2使用字典处理cookie,如下所示:
response, content = http.request(url, 'GET', headers=headers)
headers = {'Cookie': response['set-cookie']}
url = 'http://www.example.com/home'
response, content = http.request(url, 'GET', headers=headers)
Run Code Online (Sandbox Code Playgroud)
那么,我该如何设置额外的cookie?如果用字典处理,我不能有双Cookie键:S.
谢谢你的时间.
我使用httplib2来调用Amazon Web Services(AWS):
http = httplib2.Http(cache='.cache')
response, content = http.request('https://sdb.amazonaws.com/...')
Run Code Online (Sandbox Code Playgroud)
但它没有找到CA(我认为):
File "C:\Python32\lib\site-packages\httplib2\__init__.py", line 1059, in request self.disable_ssl_certificate_validation)
File "C:\Python32\lib\site-packages\httplib2\__init__.py", line 772, in __init__ context.load_verify_locations(ca_certs)
IOError: [Errno 2] No such file or directory
Run Code Online (Sandbox Code Playgroud)
我的问题:
谢谢!
我目前正在运行一个脚本,使用googleapiclient Phyton包(基于httplib2客户端对象)从Google Analytics中提取数据
- >我的脚本完美无需任何代理.
但我必须把它放在我的公司代理之后,所以我需要调整我的httplib2.Http()对象来嵌入代理信息.
在httplib2 doc 1之后,我试过:
pi = httplib2.proxy_info_from_url('http://user:pwd@someproxy:80')
httplib2.Http(proxy_info=pi).request("http://www.google.com")
Run Code Online (Sandbox Code Playgroud)
但它没有用.我总是得到一个超时错误,有或没有代理信息(因此不考虑参数中的proxy_info)
我还在pysocks包(v1.5.6)中下载了socks 并尝试"wrapmodule"httplib2,如下所述:https: //github.com/jcgregorio/httplib2/issues/205
socks.setdefaultproxy(socks.PROXY_TYPE_HTTP, "proxyna", port=80, username='p.tisserand', password='Telematics12')
socks.wrapmodule(httplib2)
h = httplib2.Http()
h.request("http://google.com")
Run Code Online (Sandbox Code Playgroud)
但我得到一个IndexError :(元组索引超出范围)
与此同时,当我使用请求包时,这个简单的代码完美地运行:
os.environ["HTTP_PROXY"] = "http://user:pwd@someproxy:80"
req = requests.get("http://www.google.com")
Run Code Online (Sandbox Code Playgroud)
问题是需要符合googleapiclient要求并提供htpplib2.Http()客户端对象.
proxy google-api httplib2 google-analytics-api python-requests
httplib2 ×10
python ×8
ssl ×3
cookiejar ×1
cookies ×1
google-api ×1
importerror ×1
java ×1
jboss ×1
networking ×1
proxy ×1
python-3.x ×1
sockets ×1
twisted ×1
windows-7 ×1