如何使用python请求以嵌套JSON格式提交数据

时间:2019-04-03 10:04:50

标签: django django-forms

我有一个使用自定义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错误的请求错误),

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})

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

1 个答案:

答案 0 :(得分:2)

默认情况下,如果您在data=dat库中使用requests,则数据将作为表单数据而不是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'})