我有一个使用自定义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})
如何以上述格式发出发帖请求?
答案 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'})