Python 无法在django 1.10中禁用CSRF检查

Python 无法在django 1.10中禁用CSRF检查,python,django,Python,Django,我正在为我的项目使用django-1.10,我想在我的项目中禁用CSRF检查。为此,我创建了一个CSRFDiable中间件,并将其添加到CommonMiddleWare之后的中间件中。同样的过程在django 1.8中对我有效,但在django 1.10中它不起作用。我也尝试过删除django.middleware.csrf.CsrfViewMiddleware,但它对我不起作用。中间件类如下所示 class DisableCSRF(object): def __init__(self

我正在为我的项目使用django-1.10,我想在我的项目中禁用CSRF检查。为此,我创建了一个CSRFDiable中间件,并将其添加到
CommonMiddleWare
之后的中间件中。同样的过程在django 1.8中对我有效,但在django 1.10中它不起作用。我也尝试过删除
django.middleware.csrf.CsrfViewMiddleware
,但它对我不起作用。中间件类如下所示

class DisableCSRF(object):

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        return self.get_response(request)

    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)


MIDDLEWARE = [

    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'common.middlewares.DisableCSRF',

    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
   ]
我在
POST
请求中遇到的错误是

{
    "detail": "CSRF Failed: CSRF token missing or incorrect."
}

全局禁用
csrf保护
不是一个好主意。但是,如果您仍然想为基于
rest框架的api禁用
CSRF
,那么您可以做的就是覆盖
django rest框架的
SessionAuthentication
类,将其添加到
django rest框架
默认的身份验证类
设置中,然后就完成了。你可以这样做

from rest_framework.authentication import SessionAuthentication 

class CsrfExemptSessionAuthentication(SessionAuthentication):

    def enforce_csrf(self, request):
        return  # it will not perform any csrf check
并在rest_框架的设置中添加

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'path of .CsrfExemptSessionAuthentication',  # path of CsrfExemptSessionAuthentication class
'rest_framework.authentication.BasicAuthentication'
),
}
我希望它对你有用


或者您可以使用
令牌基身份验证

看看你为什么要在全球范围内禁用CSRF?如果禁用
CsrfViewMiddleware
不起作用,那么您显然是在使用带有
@csrf\u protect
的视图。这些视图需要CSRF保护!!
common.Middleware.DisableCSRF
的用途是什么?您不必添加任何中间件来禁用csrf。@knbk,我使用的是
django rest framework的
通用视图
,我认为默认情况下它不会使用
@csrf\u protect
装饰程序。@HåkenLid,我正在创建一些API,在那里我不需要
csrf\u令牌
,所以我禁用了它。这是DRF在会话身份验证中显式检查CSRF令牌而不提供禁用此检查的方法的原因。会话在设计上天生容易受到CSRF攻击。通过在使用会话身份验证时禁用此检查,可以明确地使API易受CSRF攻击。不要在生产现场这样做。