debugging 打开python 3 urllib的调试输出

ni65a41a  于 2022-11-14  发布在  Python
关注(0)|答案(2)|浏览(230)

在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")
# ...
cxfofazt

cxfofazt1#

您第一次是对的。您可以简单地在文件的开头添加http.client.HTTPConnection.debuglevel = 1行来打开应用程序范围的HTTP调试。urllib.request仍然使用http.client
似乎还有一种方法可以为单个处理程序设置调试级别(通过创建urllib.request.HTTPHandler(debuglevel=1)并使用它构建一个打开器),但在我安装的Python3(3.0b3)中,它实际上并没有实现。

fjnneemd

fjnneemd2#

对于那些最近才看到这个问题的人(从2016年5月开始),虽然公认的答案在某个时候可能是正确的,但似乎从Python 3.5.2版本开始,http.client.HTTPConnection.debuglevel被完全忽略了,取而代之的是urllib.request.HTTPHandlerdebuglevel构造函数参数。
这是由于this更改,它将http.client.HTTPConnection.debuglevel的值设置为在urllib.request.HTTPHandler的构造函数参数debuglevel中设置的值(在此行中
已经打开了一个PR来修复这个问题,但是同时你可以用monkey修补HTTPHandlerHTTPSHandler__init__方法,以遵守全局值,如下所示:

https_old_init = urllib.request.HTTPSHandler.__init__

def https_new_init(self, debuglevel=None, context=None, check_hostname=None):
    debuglevel = debuglevel if debuglevel is not None else http.client.HTTPSConnection.debuglevel
    https_old_init(self, debuglevel, context, check_hostname)

urllib.request.HTTPSHandler.__init__ = https_new_init

http_old_init = urllib.request.HTTPHandler.__init__

def http_new_init(self, debuglevel=None):
    debuglevel = debuglevel if debuglevel is not None else http.client.HTTPSConnection.debuglevel
    http_old_init(self, debuglevel)

urllib.request.HTTPHandler.__init__ = http_new_init

注:我不建议将HTTPHandler中的debuglevel设置为方法参数的默认值,因为方法参数的默认值是在函数定义求值时求值的,对于HTTPHandler的构造函数来说,这是在导入模块urllib.request时。

相关问题