Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Javascript发送到Django视图的JSON对象为空_Javascript_Json_Ajax_Django - Fatal编程技术网

从Javascript发送到Django视图的JSON对象为空

从Javascript发送到Django视图的JSON对象为空,javascript,json,ajax,django,Javascript,Json,Ajax,Django,我正试图通过ajax将一些数据从Javascript发送到Django。 以下是我的JS代码: var json_name = {'name': 123} $.ajax({ method: 'POST', url: 'my url', contentType: "application/json", headers: {

我正试图通过ajax将一些数据从Javascript发送到Django。 以下是我的JS代码:

            var json_name = {'name': 123}
            $.ajax({
            method: 'POST',
            url: 'my url',
            contentType: "application/json",
            headers: {
                    'Content-Type':'application/json',
                    'X-CSRFToken': "{{ csrf_token }}"
                },

            data: JSON.stringify(json_name),
            success: function (data) {
         //this gets called when server returns an OK response
            alert("it worked!");
            },
        error: function (data) {
             alert("it didnt work");
            }
        });
            <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>

            $.ajax({
            type: 'POST',
            url: 'my url',
            // contentType: "application/json",
            // headers: {
      //               'Content-Type':'application/json',
      //               'X-CSRFToken': "{{ csrf_token }}"
      //           },
            dataType: "json",
            data: {
                senddata: JSON.stringify(json_name),
                },

            // data: json_name,

            success: function (data) {
         //this gets called when server returns an OK response
            alert("it worked!");
            },
        error: function (data) {
             alert("it didnt work");
            }
        });
以下是我的视图.py:

def myview(request):
    if request.is_ajax():
       request_data = request.body
       # data = json.loads(request.body)
       print(request_data)
       # print(data)
       return render(request, 'candidate/view.html')
    else:
       return render(request, 'candidate/view.html')
我得到的输出为
b'

当我尝试包含这些行时:

data = json.loads(request.body)
print(data)
我得到这个错误:

TypeError: the JSON object must be str, not 'bytes'
我从你那里得到了一些参考资料


有人能帮我吗?如果您需要任何其他信息来解决这个问题,我很乐意与您分享

我已经用Python3.6和Python2.7在Django 1.11上编写了一个基本测试用例

我一直在使用以下模板文件进行测试:

<button>Send data</button>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script>
$('button').on('click', function(event) {
    var data = { name: 123 };
    $.ajax({
        method: 'POST',
        url: '',
        contentType: 'application/json',
        headers: {
            'X-CSRFToken': '{{ csrf_token }}',
        },
        data: JSON.stringify(data),
        success: function() {
            console.log('Success!');
        },
        error: function() {
            console.log('Error...');
        },
    });
});
</script>
我无法重现这个问题

然而,在做了更多的研究之后,我发现Python3.6中的
json.loads
方法支持
bytes
对象,而建议它只支持字符串类型。虽然您发布的错误反映了这一点,但我试图使其生成与您看到的相同的错误,但没有成功

如您所见,我不必将CSRF保护中的方法列入白名单。纯粹基于您提供的错误,在
请求时调用
decode
。body
可能会起作用:

def index(request):
    if request.is_ajax():
        request_body = request.body.decode("utf-8")
        data = json.loads(request_body)
        print(data)
    return render(request, 'stackoverflowhelp/index.html')

在我的头发掉了一半后,我用以下方法解决了这个问题:

views.py:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def myview(request):
if request.is_ajax():
    if request.method == 'POST':
        data = request.POST.get('senddata')
        print(data)
    return render(request, 'candidate/view.html')
else:
    return render(request, 'candidate/view.html')
我的JS代码:

            var json_name = {'name': 123}
            $.ajax({
            method: 'POST',
            url: 'my url',
            contentType: "application/json",
            headers: {
                    'Content-Type':'application/json',
                    'X-CSRFToken': "{{ csrf_token }}"
                },

            data: JSON.stringify(json_name),
            success: function (data) {
         //this gets called when server returns an OK response
            alert("it worked!");
            },
        error: function (data) {
             alert("it didnt work");
            }
        });
            <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>

            $.ajax({
            type: 'POST',
            url: 'my url',
            // contentType: "application/json",
            // headers: {
      //               'Content-Type':'application/json',
      //               'X-CSRFToken': "{{ csrf_token }}"
      //           },
            dataType: "json",
            data: {
                senddata: JSON.stringify(json_name),
                },

            // data: json_name,

            success: function (data) {
         //this gets called when server returns an OK response
            alert("it worked!");
            },
        error: function (data) {
             alert("it didnt work");
            }
        });

$.ajax({
键入:“POST”,
url:“我的url”,
//contentType:“应用程序/json”,
//标题:{
//“内容类型”:“应用程序/json”,
//'X-CSRFToken':“{{csrf_token}”
//           },
数据类型:“json”,
数据:{
senddata:JSON.stringify(JSON_名称),
},
//数据:json_名称,
成功:功能(数据){
//当服务器返回OK响应时调用此函数
警惕(“成功了!”);
},
错误:函数(数据){
警惕(“它不起作用”);
}
});
当我运行它时,它显示
它不工作
,但我可以在终端中看到输出,即数据被传递

我尝试在ajax请求中包含csrf令牌,但失败了。因此,我在我的观点中使用了csrf_豁免


这可能是一种肮脏的做事方式,但它现在起作用了。如果有人有一个整洁和更好的答案,请张贴在这里

那么
json\u name
在JavaScript中包含什么?在发送请求之前,您是否检查了它是否按预期填充?是的,我在发送请求之前放置了console.log(json_name),并将其输出为:
{name:123}
您是如何触发该Ajax帖子的?是按一下按钮吗?如果是,您是否调用了
preventDefault()
?显示脚本的其余部分和html?是否尝试data=json.loads(request.body.decode('utf-8')打印(数据)
method:'POST',url:'my url',contentType:'application/json',headers:{'Content-Type':'application/json',X-CSRFToken:'{{csrf_token}},数据类型:“json”,processData:false,data:json_name,
感谢您提供的信息,它让我对概念有了一些理解。但是,我仍然得到了与
b''
相同的输出。我看不出这个答案有什么关系。OP已经在将数据转换为json字符串。和
dataType
用于服务器返回的数据,而不是发送的数据。你说得对,对不起。我以前见过这种问题,通常是因为JQuery将数据编码为查询字符串。我已经编写了一个测试用例,它似乎正确地发送了数据。我将用解决方案修改我的答案。