Python/请求:正确登录返回401个未授权
我有一个python应用程序通过基本HTTP身份验证登录到远程主机。 身份验证如下所示:Python/请求:正确登录返回401个未授权,python,python-requests,Python,Python Requests,我有一个python应用程序通过基本HTTP身份验证登录到远程主机。 身份验证如下所示: def make_authenticated_request(host, username, password): url = host r = requests.get(url, auth=(username, password)) r.raise_for_status() return r test = Looter.make_authenticated_request
def make_authenticated_request(host, username, password):
url = host
r = requests.get(url, auth=(username, password))
r.raise_for_status()
return r
test = Looter.make_authenticated_request("http://" + host + "/status/status_deviceinfo.htm", user, password)
打印此错误:
401客户端错误:url未经授权
奇怪的是,这种情况并不总是发生。对于具有相同凭据的同一主机,它会随机失败/成功
然而,登录是正确的,并且在我的浏览器中可以完美地工作。我不是巨蟒忍者。有什么线索吗?我可能会把它改写成这样。。根据需要或喜欢的方式改变它。这里的要点是,我正在使用一个会话并将其传递给其他人,以发出另一个请求。您可以重用该会话对象来发出其他请求。现在,如果您每次都像代码所建议的那样发出大量请求,则需要进行身份验证。站点可能会将您锁定在外,这就是为什么会话工作得更好,因为您不必继续进行身份验证
import requests
class Looter(object):
def __init__(self):
self.s = None
def create_session(self, url, username, password):
# create a Session
s = requests.Session()
# auth in
res = s.get(url, auth=(username, password))
if res.status_code == 200:
self.s = s
def make_request(self, url):
self.s.get(url)
#do something with the requests
l = Looter()
l.create_session(url, username, password)
# print the session to see if it authed in
print l.s.status_code
我可能会把它改写成这样。。根据需要或喜欢的方式改变它。这里的要点是,我正在使用一个会话并将其传递给其他人,以发出另一个请求。您可以重用该会话对象来发出其他请求。现在,如果您每次都像代码所建议的那样发出大量请求,则需要进行身份验证。站点可能会将您锁定在外,这就是为什么会话工作得更好,因为您不必继续进行身份验证
import requests
class Looter(object):
def __init__(self):
self.s = None
def create_session(self, url, username, password):
# create a Session
s = requests.Session()
# auth in
res = s.get(url, auth=(username, password))
if res.status_code == 200:
self.s = s
def make_request(self, url):
self.s.get(url)
#do something with the requests
l = Looter()
l.create_session(url, username, password)
# print the session to see if it authed in
print l.s.status_code
也许这就是你获得授权的方式。我几乎总是避免使用内置的auth参数,或者根据端点传入正确的参数或头来进行auth。或者更好的办法是使用会话。s=requests.Session()res=s.get(url,auth)如果res.status_code==200:s.get(url),我使用了@reticentroot提供的snipper,它使用会话。还是不起作用。也许这是你获得授权的方式。我几乎总是避免使用内置的auth参数,或者根据端点传入正确的参数或头来进行auth。或者更好的办法是使用会话。s=requests.Session()res=s.get(url,auth)如果res.status_code==200:s.get(url),我使用了@reticentroot提供的snipper,它使用会话。仍然不工作。我已经使用了你的代码。我对它的优雅赞不绝口。但是,在create_会话中发送的请求返回200,之后make_请求返回false。远程端点没有锁定机制。Hmm不使用方法,而是让_请求直接使用会话。因此,与其打印l.s.status_代码,不如执行l.s.get()。如果这仍然不起作用,那么它可能不是会话,而是url端点本身。您可以通过打印完整响应进行进一步调试。例如,打印l.s.content或打印l.s.json()或打印l.s.text有时失败的响应会更详细地告诉您失败的原因argh,即我之前评论中的错误数量。。我的问题已使用您的代码解决,但在
create_session
方法中添加了's.auth=(username,password)`而不是将is传递到s.get()
。去想想为什么。尽管如此,还是要谢谢你,标记为已接受!棒极了,没问题:-)我已经使用了你的代码。我对它的优雅赞不绝口。但是,在create_会话中发送的请求返回200,之后make_请求返回false。远程端点没有锁定机制。Hmm不使用方法,而是让_请求直接使用会话。因此,与其打印l.s.status_代码,不如执行l.s.get()。如果这仍然不起作用,那么它可能不是会话,而是url端点本身。您可以通过打印完整响应进行进一步调试。例如,打印l.s.content或打印l.s.json()或打印l.s.text有时失败的响应会更详细地告诉您失败的原因argh,即我之前评论中的错误数量。。我的问题已使用您的代码解决,但在create_session
方法中添加了's.auth=(username,password)`而不是将is传递到s.get()
。去想想为什么。尽管如此,还是要谢谢你,标记为已接受!棒极了,没问题:-)