在python 2中,可以通过执行以下操作从urllib获取调试输出:
import httplib
import urllib
httplib.HTTPConnection.debuglevel = 1
response = urllib.urlopen('http://example.com').read()
然而,在python 3中,这看起来像是被移到了
http.client.HTTPConnection.set_debuglevel(level)
然而,我使用的是urllib而不是http.client,我如何设置它,使我的http请求以这种方式显示调试信息呢?
下面是我目前使用的方法。如果我想获得调试信息,最好的方法是什么?
#Request Login page
cookiejar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookiejar))
request = urllib.request.Request(options.uri)
add_std_headers(request)
response = opener.open(request)
response_string = response.read().decode("utf8")
# ...
2条答案
按热度按时间cxfofazt1#
您第一次是对的。您可以简单地在文件的开头添加
http.client.HTTPConnection.debuglevel = 1
行来打开应用程序范围的HTTP调试。urllib.request
仍然使用http.client
。似乎还有一种方法可以为单个处理程序设置调试级别(通过创建
urllib.request.HTTPHandler(debuglevel=1)
并使用它构建一个打开器),但在我安装的Python3(3.0b3)中,它实际上并没有实现。fjnneemd2#
对于那些最近才看到这个问题的人(从2016年5月开始),虽然公认的答案在某个时候可能是正确的,但似乎从Python 3.5.2版本开始,
http.client.HTTPConnection.debuglevel
被完全忽略了,取而代之的是urllib.request.HTTPHandler
的debuglevel
构造函数参数。这是由于this更改,它将
http.client.HTTPConnection.debuglevel
的值设置为在urllib.request.HTTPHandler
的构造函数参数debuglevel
中设置的值(在此行中已经打开了一个PR来修复这个问题,但是同时你可以用monkey修补
HTTPHandler
和HTTPSHandler
的__init__
方法,以遵守全局值,如下所示:注:我不建议将
HTTPHandler
中的debuglevel
设置为方法参数的默认值,因为方法参数的默认值是在函数定义求值时求值的,对于HTTPHandler
的构造函数来说,这是在导入模块urllib.request
时。