如何禁用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.DisableCsrfCheck
到MIDDLEWARE_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