【问题标题】:How do I submit data in nested JSON format using python requests如何使用 python 请求以嵌套 JSON 格式提交数据
【发布时间】:2019-04-03 10:04:49
【问题描述】:

我有一个使用自定义 django admin 和 django 表单构建的 django 项目。我正在尝试向 API 发出发布请求。如何以嵌套格式从表单中获取数据。

我的表单目前看起来像这样,

class CampaignForm(forms.Form):
    consumer = forms.CharField(max_length=200)
    startDate = forms.DateTimeField(
        input_formats=['%d/%m/%Y %H:%M'])
    endDate = forms.DateTimeField(
        input_formats=['%d/%m/%Y %H:%M'])
    referreeCredits = forms.IntegerField()
    referrerCredits = forms.IntegerField()
    maxReferreeCredits = forms.IntegerField()
    maxReferrerCredits = forms.IntegerField()
    message = forms.CharField(max_length=200)
    kramerTemplateId = forms.CharField(max_length=200)
    paymentMode = forms.CharField(max_length=200)
    eventName = forms.CharField(max_length=200)
    operator = forms.CharField(max_length=200)
    value = forms.IntegerField()
    mOperator = forms.CharField(max_length=200)
    mValue = forms.IntegerField()
    mReferrerCredits = forms.IntegerField()

API 获取的 json 如下所示:

{
  "consumer": "FILING",
  "startDate": 0,
  "endDate": 0,
  "referreeCredits": 0,
  "referrerCredits": 0,
  "maxReferreeCredits": 0,
  "maxReferrerCredits": 0,
  "message": "string",
  "kramerTemplateId": "string",
  "eventRules": [
    {
      "eventName": "string",
      "operator": "EQUAL",
      "value": 0
    }
  ],
  "milestoneRules": [
    {
      "operator": "EQUAL",
      "value": 0,
      "referrerCredits": 0
    }
  ],
  "paymentMode": "PAYTM"
}

我也尝试对 json 进行硬编码,但未成功(我收到 400 bad request 错误),

def campaign_add(self, request):
        form = CampaignForm()
        if request.method == 'POST':
            import ipdb; ipdb.set_trace()
            form = CampaignForm(request.POST)
            if form.is_valid():
                dat = {
                        "consumer": request.POST["consumer"],
                        "startDate": self.datetime_to_epoch(request.POST["startDate"]),
                        "endDate": self.datetime_to_epoch(request.POST["endDate"]),
                        "referreeCredits": int(request.POST["referreeCredits"]),
                        "referrerCredits": int(request.POST["referrerCredits"]),
                        "maxReferreeCredits": int(request.POST["maxReferreeCredits"]),
                        "maxReferrerCredits": int(request.POST["maxReferrerCredits"]),
                        "message": request.POST["message"],
                        "kramerTemplateId": request.POST["kramerTemplateId"],
                        "eventRules": [
                            {
                            "eventName": request.POST["eventName"],
                            "operator": request.POST["operator"],
                            "value": int(request.POST["value"])
                            }
                        ],
                        "milestoneRules": [
                            {
                            "operator": request.POST["mOperator"],
                            "value": int(request.POST["mValue"]),
                            "referrerCredits": int(request.POST["mReferrerCredits"])
                            }
                        ],
                        "paymentMode": request.POST["paymentMode"]
                    }

                # import ipdb; ipdb.set_trace()
                res = requests.post("https://example.com/", data=dat)
                if res.status_code == 201 or res.status_code == 200:
                    messages.success(request, 'Success!')
                    return redirect("admin:campaign-pg1")
                else:
                    messages.error(request, 'Submission Failed.')
        return TemplateResponse(request, "admin/campaign_add.html", {"form":form})

我如何以上述格式发出帖子请求?

【问题讨论】:

  • 注意,您应该从 form.cleaned_data 字典中获取数据,而不是直接从 request.POST 获取数据。除此之外,这将在必要时转换整数。
  • 我对我的代码进行了适当的更改。谢谢!

标签: django django-forms


【解决方案1】:

默认情况下,如果您在 requests 库中使用 data=dat,则数据将作为表单数据发布,而不是 JSON。你应该这样做:

 res = requests.post("https://example.com", json=dat)

它会自动将 Content-Type 标头正确设置为application/json,或者:

 res = request.post("https://example.com", data=json.dumps(dat), headers={'content-type': 'application/json'})

【讨论】:

    猜你喜欢
    • 2015-01-23
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多