Python2 与 Python3 post 请求

标签 python django python-3.x urllib

我已经查看了似乎所有其他 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/

相关文章:

python - 我想在 django 社交应用登录后添加自定义字段

javascript - 是否可以从单独的 html 页面单击 html 页面上的按钮?

python - 用于python中单词排除的正则表达式

python - 如何将时间序列数据输入自动编码器网络进行特征提取?

python - 创建一个 Cron 作业 - Linux/Python

python - 使用docker时无法打开共享对象文件

python - HDF5格式的时间序列存储

python - 如何从 Tkinter 条目小部件获取字节数组

python - 捕获停止执行我的 Python 脚本的错误

python - 如何在 Django 管理中隐藏(而不是禁用)ModelAdmin ListView 中的操作添加模型按钮?