django/jquery/Django REST FrameWork AJAX 请求返回detail: CSRF Failed: CSRF cookie not set

 Pala   2017-12-21 15:50   174 人阅读  0 条评论

背景:

django 1.11.6

Django REST FrameWork 3.7.3

使用jquery发送ajax请求,请求方法为get,可以正常运行,请求方法为post提示错误信息:

"403 Forbidden" - "detail: CSRF Failed: CSRF cookie not set"

解决思路

  • Followed https://docs.djangoproject.com/ko/1.11/ref/csrf/

  • Tryed to delete 'django.middleware.csrf.CsrfViewMiddleware'

  • Tryed @csrf_exempt

尝试以上代码,还是使用post请求方法,提示同样的错误信息

"detail: CSRF Failed: CSRF cookie not set"

可以正常请求的jquery代码

sendMessage(message, receiverId){
    let self = this;
    var message_obj = "{\"id\":\""+ GUID.generateGUID() +"\",\"message\":\""+ message +"\",\"receiverId\":\""+ receiverId + "\",\"moddate\":\""+ Date.now() +"\"}";
    var message_json = JSON.parse(message_obj);
    $.ajax({
        type: "POST",
        url: "/chat/message/",
        data:{"message_object":message_json},
        credentials: 'same-origin',
        success: function (response) {
            alert(response);
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert(errorThrown);
        }
    })
}

可以工作的jquery回调函数

getMessages(){
    let self = this;
    $.ajax({
        type: "GET",
        url: "/chat/message/",
        dataType: "json",
        success: function (response) {
            response = JSON.stringify(response);
            alert(response);
        },
        error: function(jqXHR, textStatus, errorThrown){
            alert(errorThrown);
        }
    })
}

尝试使用csrf_exempt

urls.py

from django.conf.urls import url
from django.views.decorators.csrf import csrf_exempt

from chat_api import views

urlpatterns = [
    url(r'^message/$', csrf_exempt(views.ChatMessageAPIEndpoint.as_view())),
    url(r'^message/(?P<commit>([0-9a-fA-F])+)', csrf_exempt(views.ChatMessageAPIEndpoint.as_view())),
    url(r'^devicekey/(?P<devid>([\w+-:])+)', views.DeviceAPIEndpoint.as_view()),
    url(r'^devicekey/$', views.DeviceAPIEndpoint.as_view()),
    url(r'^contacts/$', views.ContactAPIEndpoint.as_view()),
    url(r'^read/$', views.ReadStatusEndpoint.as_view()),
]

views.py

    @csrf_exempt
    @need_post_parameters([PARAM_MESSAGE_OBJ])
    def post(self, request, *args, **kwargs):
        data = request.POST.get(PARAM_MESSAGE_OBJ)

        try:
            message_obj = json.loads(data)
        except Exception as e:
            return HttpResponseBadRequest(error_json("Could not parse JSON"))
...


解决办法

英文:

My Classes in Views.py where using "Oauth2APIView"! Changing it into "View" did solve the problem for me!


我的类在views.py,更改为视图函数可以解决这个问题

使用CBV代码模式可以解决该问题

如果有更好翻译请在评论区留言 

原文:https://stackoverflow.com/questions/45955037/ajax-call-returns-csrf-failed

本文地址:http://chenxm.cc/post/509.html
版权声明:本文为原创文章,版权归 Pala 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?