Как отправить данные в формате JSON с использованием запросов Python - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть проект django, созданный с использованием пользовательских форм django admin и 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()

json, который принимает API, выглядит следующим образом:

{
  "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 Ответ

2 голосов
/ 03 апреля 2019

По умолчанию, если вы используете 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'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...