从urllib2迁移到请求python 2.7

时间:2016-03-03 18:34:09

标签: python-2.7 python-requests

我正在尝试使用一些有效的代码并从urlib2更改为请求。 原始代码提供用户名,密码的基本登录信息,并在urllib2请求的标题中发布KEY和SECRET。以下代码是我尝试更改为使用请求模块并获得一些用于进行其他API调用的功能。我已经尝试了几十种组合并且都返回了代码400.显然,我的请求代码没有成功提供返回200响应所需的信息并提供所需的授权令牌。

## Import needed modules

import urllib2, urllib, base64
import httplib
import requests
import json

## initialize variables 

KEY = "7f1xxxx-3xxx-4xxx-9a7f-8be66839dede"
SECRET = "45xxxxxx-45xxx-469a-9ae9-a7927a76cfeb"
userName = "my-email@xxx.com"
passWord = "mypassword"
URL = "https://company.com/auth/token"
token = None
sessionid = None


DATA = urllib.urlencode({"grant_type":"password",
                         "username":userName,
                          "password":passWord})

base64string = base64.encodestring('%s:%s' % (KEY, SECRET)).replace('\n', '')
request = urllib2.Request(URL, DATA)
request.add_header("Authorization", "Basic %s" % base64string)
result = urllib2.urlopen(request)
token = result.read()
print token

这会返回我的授权令牌,一切都很顺利。我可以将令牌传递给授权服务器,并且可以完全访问api以与数据库进行交互。下面是尝试使用请求并具有它提供的附加功能。

client = requests.session()

payload = {"grant_type":"password",
           "username":userName,
           "password":passWord,
           "applicationId": KEY
           }

headers = {'content-type':'application/json',
           "grant_type":"password",
           "username":userName,
           "password":passWord,
           'applicationsId': KEY,
           'Authorization': base64string,
           'token': token,
           'sessionid': sessionid
           }

response = client.post(URL, params = payload, headers=headers)
token = response.content
print token 
 {"error":"invalid_request"}

print response
 <Response [400]>

2 个答案:

答案 0 :(得分:0)

如果您想使用基本身份验证,则应使用method from requests ..

您的帖子应该是

response = client.post(
       URL, 
       params = payload,
       headers=headers,
       auth=HTTPBasicAuth(
           KEY,
           SECRET
))

答案 1 :(得分:0)

在帖子的某个地方,另一个问题的贡献者提到一些项目实际上需要在请求的正文中而不是在标题中。我尝试了各种组合,以下解决了400响应并完成了我的目标。

 data = {"grant_type":"password",
           "username":userName,
           "password":passWord,
           "applicationId": KEY
           }

headers = {'Authorization': "Basic %s" % base64string,
           'token': token
            }


response = client.post(URL, data = data, headers=headers)
token = response.text
print token