我看了所有其他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)
库,但至少现在可以使用了。
答案 0 :(得分:1)
你的第一个片段令人困惑。你声称要发送JSON,但你不是;您正在发送标准的表单编码数据。无论如何,这是Django默认理解的。
似乎没有任何理由说明为什么你不会在Python 3中做同样的事情。为什么要串行化为JSON?只是做:
data = urllib.parse.urlencode(d)
并在两种情况下删除标题,因为您没有发送JSON。
最后,只需使用requests
。