【问题标题】:Python requests Post request data with DjangoPython 请求 使用 Django 发布请求数据
【发布时间】:2014-06-01 04:47:53
【问题描述】:

我正在尝试向一个非常简单的 django 服务器发送一个简单的发布请求,但我无法理解为什么发布数据没有出现在请求发布字典中,而是出现在请求正文中。

客户端代码:

    payload = {'test':'test'}
    headers = {'Content-type': 'application/json','Accept': 'text/plain'}
    url = "localhost:8000"
    print json.dumps(payload)
    r = requests.post(url,data=json.dumps(payload),headers=headers)

服务器代码:

def submit_test(request):
    if request.method == 'POST':
          print 'Post: "%s"' % request.POST
          print 'Body: "%s"' % request.body
          return HttpResponse('')

服务器上打印出来的是:

Post: "<QueryDict: {}>"
Body: "{"test": "test"}"

我玩过标题并将数据作为直接字典发送,但似乎没有任何效果。

有什么想法吗?谢谢!!

【问题讨论】:

    标签: python django


    【解决方案1】:

    POST 字典仅包含在请求正文中发送的表单编码数据。 body 属性包含请求的原始正文作为字符串。由于您发送的是 json 编码的数据,因此它仅显示在原始 body 属性中,而不显示在 POST 中。

    docs 中查看更多信息。

    尝试表单编码的数据,您应该也会看到 POST dict 中的值:

    payload = {'test':'test'}
    url = "localhost:8000"
    requests.post(url, data=payload)
    

    【讨论】:

    • 我试过了,它给了我同样的东西。仅仅从身体中读取并从那里处理它有什么严重错误吗?谢谢!
    • 如果是通过json与服务器通信,从body属性中读取内容是我相信的规范方法。这是我过去所做的。 :)
    【解决方案2】:

    在标头中指定用户代理应该使 Django 能够解释正文的原始数据并正确填充 POST 字典。以下应该有效:

    payload = {'test': 'test'}
    url = "http://localhost:8000"
    headers = {'User-Agent': 'Mozilla/5.0'}
    requests.post(url, data=payload, headers=headers)
    

    【讨论】:

    • 我知道,这条评论迟了,但这应该是正确的解决方案,因为这是唯一的工作方法!
    【解决方案3】:

    您应该从标题中删除“Content-type”并使用默认的“multipart/form-data”

    response = client.post(
        '/some_url/',
        data={'post_key': 'some_value'},
        # content_type='application/json'
    )
    

    如果您取消注释 'content_type' 数据将仅在 request.body 中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多