django获取ajax POST过来的数据时失败

前端代码是这样的

<script>
    var csrftoken = Cookies.get('csrftoken');
    function csrfSafeMethod(method) {
        // these HTTP methods do not require CSRF protection
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    $.ajaxSetup({
        beforeSend: function (xhr, settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", csrftoken);
            }
        }
    });
    console.log(csrftoken);
    function login() {
        alert($("#username").val());
        $.ajax({
            url: "../auth",
            type: "post",
            headers: {'Content-Type': 'application/json',"X-CSRFToken":csrftoken},
            data: JSON.stringify({
                username:$("#user_name").val(),
                password:$("#password").val()
            })
        }).done(function (data) {

        }).fail(function () {
            alert("请求失败");
        });
    }
</script>

跨域访问什么的都已经通过加上X-CSRFToken解决了。

然后后端的view是这样写的:

@require_http_methods(["POST"])
def auth(request):
    word=request.POST.get('username','123')
    return HttpResponse(word)

结果得到的response数据是123,也就是说request.POST.get('username','123')这里面读取不到username的值?

请问是为什么啊

阅读 11.3k
3 个回答

我最终找到解决方法了,并不是因为前端加了JSON.stringify的问题。
如果不加JSON.stringify,那么前端传来的request的body就是"username"="test","password"="123"了。而且,即便是换成了这样的CGI格式的请求,后端还是取出不了数据。
所以我换成了直接自己去解析request.body(这里有个小坑,就是需要先decode()一下),然后就能正常拿到请求的json了。
代码如下:

import json
@require_http_methods(["POST"])
def auth(request):
    user_obj=json.loads(request.body.decode())
    return HttpResponse(user_obj['username'])

不过还是感谢各位的帮助!

新手上路,请多包涵

function login() {

    alert($("#username").val());
    $.ajax({
        url: "../auth",
        type: "post",
        headers: {'Content-Type': 'application/json',"X-CSRFToken":csrftoken},
        dataType: "json",
        data: {
            username:$("#user_name").val(),
            password:$("#password").val()
        }
    }).done(function (data) {

    }).fail(function () {
        alert("请求失败");
    });
}

ajax应该直接在data写上要发送的数据,而不是 JSON.stringify,这个把你要发送的数据格式化成字符串了。。

推荐问题
宣传栏