【发布时间】:2017-09-10 13:46:11
【问题描述】:
我在我的项目中使用 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?如果禁用
CsrfViewMiddleware不起作用,那么您显然正在使用带有@csrf_protect的视图。 这些视图需要 CSRF 保护!! -
common.middlewares.DisableCSRF的目的是什么?您不必添加任何中间件来禁用 csrf。 -
@knbk,我使用的是
django-rest-framework'sgeneric views,我不认为它默认使用@csrf_protect装饰器。 -
@HåkenLid,我正在创建一些 api,我不需要
csrf_token,所以我禁用它。