如何禁用Django的CSRFvalidation?

我在settings.py注释了csrf处理器和中间件行:

 122 123 TEMPLATE_CONTEXT_PROCESSORS = ( 124 'django.contrib.auth.context_processors.auth', 125 # 'django.core.context_processors.csrf', 126 'django.core.context_processors.request', 127 'django.core.context_processors.static', 128 'cyathea.processors.static', 129 ) 130 131 MIDDLEWARE_CLASSES = ( 132 'django.middleware.common.CommonMiddleware', 133 'django.contrib.sessions.middleware.SessionMiddleware', 134 # 'django.middleware.csrf.CsrfViewMiddleware', 135 'django.contrib.auth.middleware.AuthenticationMiddleware', 136 'django.contrib.messages.middleware.MessageMiddleware', 137 'django.middleware.locale.LocaleMiddleware', 138 # Uncomment the next line for simple clickjacking protection: 139 # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 140 ) 

但是,当我使用Ajax发送请求时,Django仍然响应“csrf标记不正确或丢失”,并且在向标题添加X-CSRFToken之后,请求会成功。

这里发生了什么 ?

如果你只是需要一些不使用CSRF的视图,你可以使用@csrf_exempt

 from django.views.decorators.csrf import csrf_exempt @csrf_exempt def my_view(request): return HttpResponse('Hello world') 

你可以在这里find更多的例子和其他场景:

要为基于类的视图禁用CSRF,以下为我工作。
使用django 1.10和python 3.5.2

 from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator @method_decorator(csrf_exempt, name='dispatch') class TestView(View): def post(self, request, *args, **kwargs): return HttpResponse('Hello world') 

答案可能不合适,但我希望它可以帮助你

 class DisableCSRFOnDebug(object): def process_request(self, request): if settings.DEBUG: setattr(request, '_dont_enforce_csrf_checks', True) 

像这样的中间件有助于debugging请求并检查生产服务器中的csrf。

在MIDDLEWARE的settings.py中,你可以直接删除这一行,'django.middleware.csrf.CsrfViewMiddleware',

如果你想在全局禁用它,你可以写一个自定义的中间件,就像这样

 from django.utils.deprecation import MiddlewareMixin class DisableCsrfCheck(MiddlewareMixin): def process_request(self, req): attr = '_dont_enforce_csrf_checks' if not getattr(req, attr, False): setattr(req, attr, True) 

然后添加这个类youappname.middlewarefilename.DisableCsrfCheckMIDDLEWARE_CLASSES列表中,之前django.middleware.csrf.CsrfViewMiddleware

可以在视图层面强制执行CSRF,而不能在全局范围内禁用

在某些情况下,这是一个痛苦,但是,“这是为了安全”。 得保留那些AAA评级。

https://docs.djangoproject.com/en/dev/ref/csrf/#contrib-and-reusable-apps

您可以禁用CSRF来创build自己的中间件:

制作一个名称为“Core”的django应用程序,并在该应用程序中创build一个文件“utils.py”,并将代码放置在该文件的下面:

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

并将这个中间件包含在MIDDLEWARE_CLASSES的settings.py文件中。

'core.utils'

还有一种方法:

你可以使用@csrf_exempt装饰器

 from django.views.decorators.csrf import csrf_exempt @csrf_exempt