首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django Tastypie总是返回401未授权

Django Tastypie总是返回401未授权
EN

Stack Overflow用户
提问于 2014-05-15 17:31:13
回答 2查看 1.7K关注 0票数 1

我使用ajax请求来访问我的tastypie资源,但是即使我使用SessionAuthentication()和DjangoAuthorization(),它也总是得到401。

resources.py

代码语言:javascript
复制
class EventsResource(ModelResource):

user = fields.ForeignKey(UserResource, 'user')

    class Meta:
        queryset = Event.objects.all()
        resource_name = 'events'
        filtering = {'start': ALL,
                     'end':ALL
                     }
        list_allowed_methods = ['get', 'post','put', 'patch']
        detail_allowed_methods = ['get', 'post', 'put', 'delete']
        authentication = SessionAuthentication()
        authorization = Authorization()
        include_resource_uri = True
        limit = 0
        always_return_data = True

这是一个日历的资源,所以我有一个事件模型,我的ajax请求在django-admin中加载的一个javascript文件中;我还检查了请求头是否有csrf令牌和会话id,但它不起作用。

代码语言:javascript
复制
.ajax({
                    url:  event.resource_uri,
                    dataType: 'json',
                    contentType: 'application/json; encode=UTF-8',
                    type: 'DELETE',
                    success: function () {
                        $calendar.fullCalendar('removeEvents');
                        $calendar.fullCalendar('refetchEvents');
                        $('#modal-confirm').modal('hide');
                        showmsg('Evento eliminato correttamente', 'warning');
                    }
                });
EN

回答 2

Stack Overflow用户

发布于 2014-05-20 03:03:00

您正在使用SessionAuthentication,但没有提供CSRF令牌头(我看到您检查过它,但它没有出现在您的代码中)。

在包含JavaScript的页面中的某处包含{% csrf_token %}标记,然后使用beforeSend选项修改AJAX方法以设置X-CSRF-Token标头:

代码语言:javascript
复制
$.ajax({
    url:  event.resource_uri,
    dataType: 'json',
    contentType: 'application/json; encode=UTF-8',
    type: 'DELETE',
    beforeSend: function(jqXHR) {
        jqXHR.setRequestHeader('X-CSRFToken', $('input[name=csrfmiddlewaretoken]').val());
    },
    success: function () {
        $calendar.fullCalendar('removeEvents');
        $calendar.fullCalendar('refetchEvents');
        $('#modal-confirm').modal('hide');
        showmsg('Evento eliminato correttamente', 'warning');
    }
});
票数 1
EN

Stack Overflow用户

发布于 2017-04-03 18:22:02

您应该将CSRF令牌作为POST数据传递给每个POST请求。推荐的CSRF令牌来源是cookies,如下所示:

代码语言:javascript
复制
getCookie: function(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = $.trim(cookies[i]);
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

然后,在AJAX请求上设置头部,如下所示:

代码语言:javascript
复制
var csrftoken = this.getCookie('csrftoken');
//Use Setup prior or use the beforeSend on the fly 
/*$.ajaxSetup({
    beforeSend: function(xhr, settings) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
});*/
$.ajax({
    type: "POST",
    dataType: "json",
    contentType: "application/json",
    url: "/my/uri/",
    data: {"any": "thing"},
    beforeSend: function(xhr, settings) {
        xhr.setRequestHeader("X-CSRFToken", csrftoken);
    },
    success: function(data) {
        console.log("Weeey") ;
    }
});

参考:https://docs.djangoproject.com/en/1.8/ref/csrf/#ajax

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23674337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档