Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/请求:正确登录返回401个未授权_Python_Python Requests - Fatal编程技术网

Python/请求:正确登录返回401个未授权

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

我有一个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("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()
。去想想为什么。尽管如此,还是要谢谢你,标记为已接受!棒极了,没问题:-)