从请求迁移到urllib2

时间:2016-10-18 20:52:07

标签: python python-2.7 urllib2

我已经不再使用python请求库了,因为开始使用Google App Engine有点繁琐。相反,我正在使用urllib2,它有更好的支持。不幸的是,以前使用请求库的POST请求不再适用于urllib2。

请求代码如下

values = { 'somekey' : 'somevalue'}
r = requests.post(some_url, data=values)

使用urllib2,代码如下

values = { 'somekey' : 'somevalue'}
data = urllib.urlencode(values)
req = urllib2.Request(some_url, data)
response = urllib2.urlopen(req)

不幸的是,后者引发了以下错误

HTTP Error 405: Method Not Allowed

我发布的网址格式如下:

some_url = 'http://ec2-11-111-111-1.compute-1.amazonaws.com'

我有read使用urllib2跟踪斜杠有问题,但是当我按如下方式添加斜杠时

some_url = 'http://ec2-11-111-111-1.compute-1.amazonaws.com/'

我仍然得到同样的错误。

目的地没有重定向 - 因此请求不应转换为GET。即使它是,该url实际上接受GET和POST请求。 EC2 linux实例正在运行django,我可以看到它成功接收请求并使用它 - 所以不会返回405.由于某种原因,urllib2正在拾取405并抛出异常。

关于可能出错的任何想法?

编辑1:

根据@ philip-tzou的好话,以下信息可能会有所帮助

print req.get_method()

收益POST

print req.header_items()

收益[]

编辑2

添加用户代理标头(如@ padraic-cunningham建议的那样)不幸地解决了它。我添加了urllib2 example

中显示的相同标头
    user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
    headers = {'User-Agent': user_agent}
    data = urllib.urlencode(values)
    req = urllib2.Request(some_url, data, headers)

编辑3

正如@furas建议的那样,我已经将请求发送给requestb.in,以便仔细检查发送的内容。这确实是一个POST请求,包含以下标题:

Connection: close
Total-Route-Time: 0
X-Cloud-Trace-Context: ed073df03ccd05657<removed>2a203/<removed>129639701404;o=5
Connect-Time: 1
Cf-Ipcountry: US
Cf-Ray: <removed>1d155ac-ORD
Cf-Visitor: {"scheme":"http"}
Content-Length: 852
Content-Type: application/x-www-form-urlencoded
Via: 1.1 vegur
X-Request-Id: 20092050-5df4-42f8-8fe0-<removed>
Accept-Encoding: gzip
Cf-Connecting-Ip: <removed>
Host: requestb.in
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppEngine-Google; (+http://code.google.com/appengine; appid: s~<removed>)

现在req.header_items()会产生[('User-agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)')]

作为比较,来自请求POST的标题是

Cf-Connecting-Ip: <removed>
Accept-Encoding: gzip
Host: requestb.in
Cf-Ipcountry: US
Total-Route-Time: 0
Cf-Ray: 2f42a45185<removed>-ORD
Connect-Time: 1
Connection: close
Cf-Visitor: {"scheme":"http"}
Content-Type: application/x-www-form-urlencoded
Content-Length: 852
X-Cloud-Trace-Context: 8932f0f9b165d9a0f698<removed>/1740038835186<removed>;o=5
Accept: */*
X-Request-Id: c88a29e1-660e-4961-8112-<removed>
Via: 1.1 vegur
User-Agent: python-requests/2.11.1 AppEngine-Google; (+http://code.google.com/appengine; appid: s~<removed>)

0 个答案:

没有答案