使用ajax POST方法向Django发送JSON对象数组时403(禁止错误)

时间:2016-10-31 08:59:49

标签: jquery python json ajax django

使用ajax POST方法向Django View发送JSON对象数组时,我得到403(Forbidden Error)。我已经包含了csrf令牌,但它仍然给出了相同的错误。我正在对不同的事件进行2个不同的ajax调用,其中一个正常工作而另一个发出403错误。 这是我的代码:

此POST请求正常。

$(document).on('submit','#dataset', function (e) {
      e.preventDefault();

      $.ajax({
          type:'POST',
          url:'/savedataset/',
          data:{
              lat:$('#lat').val(),
              long:$('#long').val(),
              csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
          },
          success:function (data) {
              alert(data);

          },
          error:function () {
              alert("Error")
          }
      })

  });

以上是请求的view.py:

def savedata(request):
if request.method == 'POST':
    lat = request.POST['lat']
    long = request.POST['long']

    nsrpt.objects.create(
        latitude=lat,
        longitude=long
    )
response_data = {"lat": lat, "long": long}
return HttpResponse(json.dumps(response_data), content_type="application/json")

但是这个会返回403错误:

$(document).ready(function () {
      $('#Save').click(function (e) {
          $.ajax({
              type:'POST',
              url:'/savenetwork/',
              dataType:'json',
              data:{
                  networkdata: JSON.stringify(grapharr),
                  csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
              },
              contentType:'application/json',
              success:function (data) {
                  alert(data);
              }

          })

      })

  })

这里“grapharr”是一个动态创建的数组,每个索引都有json对象,这个POST请求的视图是view.py:

import json
from django.core import serializers
from django.http import HttpResponse
from django.shortcuts import render

def savenetwork(request):
if request.method == 'POST':
    data = json.load(request.body)
response_data = {"data" : "Test"}
return HttpResponse(json.dumps(response_data), content_type="application/json")

以下是grapharr的创建方式:

var grapharr = [];
  function pushtoarray2(lat, long) {
      var lati = lat;
      var longi = long;
      var node = new Object();
      node.latitude = lati;
      node.longitude = longi;
      node.connectednodes = [];
      grapharr.push(node);
  }

CSRF令牌在此处定义:

<form id="dataset"> {% csrf_token %}
  <fieldset>
    <p>
      <label>Latitude</label>
      <input id = "lat" value = "" />
    </p>
    <p>
      <label>Longitude</label>
      <input id = "long" value = "" />
    </p>
    <p>
      <button name="Add" value="Add" type="button" onclick="addmarker()">Add</button>
    </p>
    <select id="myselect" multiple size="5">
    </select>
    <p>
      <button name="Connect" value="Connect" type="button" onclick="getSelectValues()">Connect</button>
    </p>
    <p>
      <button name="Delete" value="Delete" type="button" onclick="deletelatlong()">Delete</button>
    </p>
      <input type="submit" value="Submit">
      <p>
      <button id="fetch" name="fetch" value="fetch" type="button">Fetch</button>
    </p>

  </fieldset>
    <div id="map"></div>
    <p>
      <button id="Save" name="Save" value="Save" type="button">Save Network</button>
    </p>
    <p>
      <button name="Clear" value="Clear" type="button" onclick="printArray()">Clear Map</button>
    </p>

这是url.py

from django.conf.urls import url
from networkeditor import views
urlpatterns = [
url(r'^$', views.index, name = 'index'),
url(r'^savedataset/$', views.savedata),
url(r'^fetchdata/$', views.fetchdata),
url(r'^savenetwork/$', views.savenetwork),
]

我尝试了很多但是在所提到的每个地方都包含了已经存在的csrf令牌。请帮助我找到我在这里失踪的东西。我是django / ajax的新手。

0 个答案:

没有答案