Django Rest Framework,ajax POST 有效,但 PATCH 抛出 CSRF 失败:CSRF 令牌丢失或不正确

djangoAjax

1个回答

写回答

Zd2333

2025-06-24 17:45

+ 关注

Django
Django

使用Django Rest Framework进行Web开发时,我们经常需要通过Ajax请求来发送和接收数据。在我的项目中,我遇到了一个问题:在使用POST方法时,一切正常,但是当我尝试使用PATCH方法时,却抛出了一个CSRF(Cross-Site Request Forgery)失败的错误,提示说CSRF令牌丢失或不正确。

为了解决这个问题,我首先需要了解CSRF是什么以及为什么会发生在PATCH方法中而不是POST方法中。

CSRF是一种常见的Web攻击方式,攻击者通过伪造用户的身份,发送恶意请求来执行未经授权的操作。为了防止这种攻击,Django默认开启了CSRF保护机制,即要求每个请求都携带一个有效的CSRF令牌。

在我的项目中,当使用POST方法时,我成功地通过在请求头中添加CSRF令牌来通过CSRF验证。然而,在使用PATCH方法时,我却遇到了问题。经过一番研究,我发现Django Rest Framework在处理PATCH请求时,并没有自动为请求添加CSRF令牌,导致了CSRF验证失败的错误。

为了解决这个问题,我需要手动为PATCH请求添加CSRF令牌。下面是我遇到问题的部分代码:

Javascript

$.Ajax({

url: '/api/my_endpoint/',

method: 'PATCH',

data: {

field1: 'new_value1',

field2: 'new_value2'

},

beforeSend: function(xhr, settings) {

xhr.setRequestHeader("X-CSRFToken", getcookie('csrftoken')); // 添加CSRF令牌

},

success: function(response) {

console.log('PATCH请求成功!');

},

error: function(xhr, status, error) {

console.error('PATCH请求失败:' + error);

}

});

在这段代码中,我使用了jQuery的Ajax方法发送了一个PATCH请求。在请求发送之前,通过beforeSend回调函数,我手动为请求头添加了X-CSRFToken字段,并将其值设置为从cookie中获取的CSRF令牌。

通过这个简单的修改,我成功地解决了CSRF验证失败的问题,并且PATCH请求也得到了正确的处理。

解决PATCH请求中的CSRF问题

在以上的代码中,我通过手动为PATCH请求添加CSRF令牌的方式解决了CSRF验证失败的问题。这种方式可以确保在发送PATCH请求时,CSRF验证能够通过。

然而,为了进一步提高代码的可读性和可维护性,我们可以考虑使用Django Rest Framework提供的更方便的解决方案。

Django Rest Framework提供了一个装饰器@api_view,用于标记视图函数需要执行的操作,如GET、POST、PATCH等。在使用@api_view装饰器时,我们可以指定csrf_exempt=True参数,来告诉Django Rest Framework不对该视图函数进行CSRF验证。

下面是使用@api_view装饰器解决PATCH请求中CSRF问题的例子:

Python

from rest_framework.decorators import api_view, permission_classes

from rest_framework.permissions import AllowAny

from Django.views.decorators.csrf import csrf_exempt

@api_view(['PATCH'])

@permission_classes([AllowAny])

@csrf_exempt

def my_endpoint(request):

# 处理PATCH请求的逻辑

pass

在这个例子中,我使用了@api_view(['PATCH'])装饰器来标记my_endpoint视图函数需要处理PATCH请求。然后,通过@permission_classes([AllowAny])装饰器,我告诉Django Rest Framework不对该视图函数进行权限验证。最后,通过@csrf_exempt装饰器,我告诉Django Rest Framework不对该视图函数进行CSRF验证。

通过这种方式,我成功地解决了PATCH请求中的CSRF问题,并且代码更加简洁和清晰。

在使用Django Rest Framework进行Web开发时,我们经常会遇到CSRF验证的问题。在处理PATCH请求时,为了解决CSRF验证失败的问题,我们可以手动为请求添加CSRF令牌,或者使用@api_view装饰器来告诉Django Rest Framework不对该视图函数进行CSRF验证。

无论哪种方式,都可以帮助我们解决PATCH请求中的CSRF问题,确保我们的应用程序在安全的环境下运行。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号