gpt4 book ai didi

FancyURLopener、401 和 "Connection: close"的 Python 问题

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:41 25 4
gpt4 key购买 nike

我是 Python 的新手,所以如果我遗漏了一些明显的东西,请原谅我。

我正在使用 urllib.FancyURLopener 来检索网络文档。在 Web 服务器上禁用身份验证时它工作正常,但在启用身份验证时失败。

我的猜测是我需要继承 urllib.FancyURLopener 来覆盖 get_user_passwd() 和/或 prompt_user_passwd() 方法。所以我做了:

class my_opener (urllib.FancyURLopener):

# Redefine
def get_user_passwd(self, host, realm, clear_cache=0):
print "get_user_passwd() called; host %s, realm %s" % (host, realm)
return ('name', 'password')

然后我尝试打开页面:

try:
opener = my_opener()
f = opener.open ('http://1.2.3.4/whatever.html')
content = f.read()
print "Got it: ", content

except IOError:
print "Failed!"

我希望 FancyURLopener 能够处理 401,调用我的 get_user_passwd(),然后重试请求。

它没有;当我调用“f = opener.open()”时出现 IOError 异常。

Wireshark 告诉我请求已发送,服务器正在发送“401 Unauthorized”响应,其中包含两个感兴趣的 header :

WWW-Authenticate: BASIC
Connection: close

然后连接关闭,我捕捉到我的异常,一切都结束了。

即使我在 IOError 之后重试“f = opener.open()”,它也会以同样的方式失败。

我已经通过使用简单的“打印‘收到 401 错误’”覆盖 http_error_401() 方法来验证我的 my_opener() 类正在工作。我也尝试过覆盖 prompt_user_passwd() 方法,但这也没有发生。

我看不到主动指定用户名和密码的方法。

那么如何让 urllib 重试请求呢?

谢谢。

最佳答案

我刚刚在我的网络服务器 (nginx) 上尝试了您的代码,它按预期工作:

  • 从urllib客户端获取
  • HTTP/1.1 401 未经服务器授权

    Connection: close
    WWW-Authenticate: Basic realm="Restricted"
  • 客户端再次尝试授权 header

    Authorization: Basic <Base64encoded credentials>
  • 服务器响应 200 OK + Content

所以我猜你的代码是正确的(我用 python 2.7.1 试过了),也许你试图访问的网络服务器没有按预期工作。这是使用免费的 http 基本身份验证测试站点 browserspy.dk 测试的代码(似乎他们使用的是 apache - 代码按预期工作):

import urllib

class my_opener (urllib.FancyURLopener):

# Redefine
def get_user_passwd(self, host, realm, clear_cache=0):
print "get_user_passwd() called; host %s, realm %s" % (host, realm)
return ('test', 'test')

try:
opener = my_opener()
f = opener.open ('http://browserspy.dk/password-ok.php')
content = f.read()
print "Got it: ", content

except IOError:
print "Failed!"

关于FancyURLopener、401 和 "Connection: close"的 Python 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2382338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com