Python2与Python3发布请求

时间:2018-02-03 22:14:30

标签: python django python-3.x urllib

我看了所有其他python3 urllib帖子似乎没什么用。

我有一个Django(v1.11.1,使用Python2)应用程序应该接受POST请求(例如发送一些JSON数据);它使用urllib / urllib2在python2中工作,但是使用python3(和urllib)我无法让它发送Django理解的请求。寻求帮助以获得这些分类。

我的Django视图功能:

import urllib
import urllib2
import json

d={'foo': 1, 'bar': 2} 
data = urllib.urlencode(d)
req = urllib2.Request(url, {'Content-Type': 'application/json'})
f = urllib2.urlopen(req, data=data) # works!

这是Python2中的工作请求:

<QueryDict: {u'foo': [u'1'], u'bar': [u'2']}>

查看我的Django应用程序中的日志,我发现它理解了请求:

import urllib.parse
import urllib.request
import json

d={'foo': 1, 'bar': 2} 
data = json.dumps(d).encode('utf8')
req = urllib.request.Request(url, 
                         data=data, 
                         headers={'Content-type': 'application/json'})
f = urllib.request.urlopen(req)

现在,对于Python3,这是我的请求方法:

<QueryDict: {}>

我的Django日志显示:

request.method

Django还报告POST确实requests,但无论出于何种原因,它都不理解我作为帖子请求的一部分发送的实际JSON。我也按照其他主题的建议尝试了ascii库,但似乎没有任何工作 - 我总是对POST内容感到空白。最后,我还在编码方法中尝试了import urllib.parse import urllib.request d={'foo': 1, 'bar': 2} data = urllib.parse.urlencode(d).encode('utf8') req = urllib.request.Request(url, data=data) f = urllib.request.urlopen(req) (而不是显示的utf8)。

任何提示?有没有办法可以检查urllib实际对URL进行的传出请求?谢谢!

编辑:

如下面的评论所述,我不了解我发送的实际内容。我的Python3工作版现在是:

requests

我最终可能会升级到names(my_list)库,但至少现在可以使用了。

1 个答案:

答案 0 :(得分:1)

你的第一个片段令人困惑。你声称要发送JSON,但你不是;您正在发送标准的表单编码数据。无论如何,这是Django默认理解的。

似乎没有任何理由说明为什么你不会在Python 3中做同样的事情。为什么要串行化为JSON?只是做:

data = urllib.parse.urlencode(d)

并在两种情况下删除标题,因为您没有发送JSON。

最后,只需使用requests