Python 无法在django 1.10中禁用CSRF检查
我正在为我的项目使用django-1.10,我想在我的项目中禁用CSRF检查。为此,我创建了一个CSRFDiable中间件,并将其添加到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
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攻击。不要在生产现场这样做。