Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.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 从请求迁移到urllib2后,POST请求失败_Python_Python 2.7_Urllib2 - Fatal编程技术网

Python 从请求迁移到urllib2后,POST请求失败

Python 从请求迁移到urllib2后,POST请求失败,python,python-2.7,urllib2,Python,Python 2.7,Urllib2,我已经不再使用python请求库,因为使用Google应用程序引擎有点麻烦。相反,我使用的是urllib2,它有更好的支持。不幸的是,以前使用请求库的POST请求不再使用urllib2 对于请求,代码如下所示 values = { 'somekey' : 'somevalue'} r = requests.post(some_url, data=values) values = { 'somekey' : 'somevalue'} data = urllib.urlencode(values)

我已经不再使用python请求库,因为使用Google应用程序引擎有点麻烦。相反,我使用的是urllib2,它有更好的支持。不幸的是,以前使用请求库的POST请求不再使用urllib2

对于请求,代码如下所示

values = { 'somekey' : 'somevalue'}
r = requests.post(some_url, data=values)
values = { 'somekey' : 'somevalue'}
data = urllib.urlencode(values)
req = urllib2.Request(some_url, data)
response = urllib2.urlopen(req)
对于urllib2,代码如下

values = { 'somekey' : 'somevalue'}
r = requests.post(some_url, data=values)
values = { 'somekey' : 'somevalue'}
data = urllib.urlencode(values)
req = urllib2.Request(some_url, data)
response = urllib2.urlopen(req)
不幸的是,后者引发了以下错误

HTTP Error 405: Method Not Allowed
我要发布到的url具有以下表单:

some_url = 'http://ec2-11-111-111-1.compute-1.amazonaws.com'
我发现urllib2的尾部斜杠有一个问题,但是当我添加斜杠时,如下所示

some_url = 'http://ec2-11-111-111-1.compute-1.amazonaws.com/'
我仍然会犯同样的错误

目标位置没有重定向,因此请求不应转换为GET。即使是这样,url实际上也接受GET和POST请求。EC2Linux实例正在运行django,我可以看到它成功地接收了请求并使用了它——因此没有返回405。出于某种原因,urllib2正在拾取405并抛出异常

对可能出现的问题有什么想法吗

编辑1: 根据@philip tzou的好电话,以下信息可能会有所帮助

print req.get_method()
产生
POST

print req.header_items()
产生
[]

编辑2 不幸的是,添加用户代理头(正如@padraic cunningham所建议的)并没有解决这个问题。我添加了相同的标题,如

编辑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.get_method()
req.header_items()
时,结果是什么?您可以使用来比较
urlib2
请求和
请求。在urllib代码中,post
在哪里指定您的请求是
post
Request()
是否默认为
POST
如果
data
存在?@JohnGordon是-文档显示,如果数据存在,则默认为POST请求。是否尝试添加标题?请求将公共头添加到每个请求中,这可能就是问题所在。当您打印
req.get_method()
req.header_items()
时,结果是什么?您可以使用来比较
urlib2
请求和
请求。在urllib代码中,post
在哪里指定您的请求是
post
Request()
是否默认为
POST
如果
data
存在?@JohnGordon是-文档显示,如果数据存在,则默认为POST请求。