我已经查看了似乎所有其他 python3 urllib 帖子,但似乎没有任何效果。
我有一个 Django(v1.11.1,使用 Python2)应用程序,该应用程序应该接受 POST 请求(例如,向其发送一些 JSON 数据);它在 python2 中使用 urllib/urllib2 工作,但在 python3 (和 urllib)中我无法让它发送 Django 理解的请求。寻求一些帮助来解决这个问题。
我的Django View 函数:
def update_db(request):print dir(request)
print request.POST
return HttpResponse('Thanks for visiting.')
这是 Python2 中的工作请求:
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!
查看我的 Django 应用程序中的日志,我发现它理解了该请求:
<QueryDict: {u'foo': [u'1'], u'bar': [u'2']}>
现在,对于 Python3,这是我的请求方法:
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)
我的 Django 日志显示:
<QueryDict: {}>
Django 还报告 request.method
确实是 POST
,但无论出于何种原因,它无法理解我作为 post 请求的一部分发送的实际 JSON。我还尝试了 requests
库,正如其他线程中所建议的那样,但似乎没有任何效果——我的 POST 内容总是空白。最后,我还在编码方法中尝试了 ascii
(而不是显示的 utf8)。
有什么建议吗?有没有办法可以检查 urllib 实际上对 url 发出的传出请求?谢谢!
编辑:
正如下面的评论中提到的,我不理解我发送的实际内容。我的 Python3 工作版本现在为:
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)
我最终可能会升级到 requests
库,但至少现在可以了。
最佳答案
你的第一个片段令人困惑。您声称要发送 JSON,但实际上没有;您正在发送标准表单编码数据。无论如何,这就是 Django 默认理解的内容。
不过,似乎没有任何理由不在 Python 3 中执行相同的操作。为什么要序列化为 JSON?只要这样做:
data = urllib.parse.urlencode(d)
并且在这两种情况下都删除 header ,因为您没有发送 JSON。
最后,只需使用请求
。
关于Python2 与 Python3 post 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48602625/