如何禁用Django的CSRF验证?

MrR*_*ROY 96 python django

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

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 )
Run Code Online (Sandbox Code Playgroud)

但是当我使用Ajax发送请求时,Django仍然会响应'csrf令牌不正确或丢失',并且在将X-CSRFToken添加到头文件后,请求将成功.

这里发生了什么 ?

Sal*_*lab 205

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

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到更多示例和其他方案:

  • @MrROY,这是一个Django的事情.大多数事情确实有效/不起作用只是因为在代码库的深处有一个神奇的设置. (6认同)
  • 嗯 - 也许是技术上正确的答案,但绝大多数肯定不是OP想要的或我想要的. (3认同)
  • 嗨,@ TheBronx,我真的想知道为什么我的解决方案不起作用. (2认同)
  • 提醒:如果您在同一视图中有其他装饰器,则顺序是相关的:所以首先放置@csrf_exempt. (2认同)

小智 32

要为基于类的视图禁用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')
Run Code Online (Sandbox Code Playgroud)


小智 15

setting.pyMIDDLEWARE中,您只需删除/注释此行:

'django.middleware.csrf.CsrfViewMiddleware',
Run Code Online (Sandbox Code Playgroud)

  • @xtrinch 确保完全退出/重新启动服务器进程。我不认为自动重新加载会带来变化 (3认同)

Fra*_*ant 12

对于Django 2:

from django.utils.deprecation import MiddlewareMixin


class DisableCSRF(MiddlewareMixin):
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)
Run Code Online (Sandbox Code Playgroud)

必须settings.MIDDLEWARE在适当时添加该中间件(例如,在测试设置中).

注意:不再调用该设置MIDDLEWARE_CLASSES.


nar*_*ren 11

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

class DisableCSRFOnDebug(object):
    def process_request(self, request):
        if settings.DEBUG:
            setattr(request, '_dont_enforce_csrf_checks', True)
Run Code Online (Sandbox Code Playgroud)

拥有这样的中间件有助于调试请求并检查生产服务器中的csrf.


小智 7

这里的问题是SessionAuthentication执行自己的CSRF验证。这就是即使在注释了CSRF中间件的情况下,也得到CSRF丢失错误的原因。您可以在每个视图中添加@csrf_exempt,但是如果您想禁用CSRF并为整个应用进行会话身份验证,则可以添加一个额外的中间件,如下所示:

class DisableCSRFMiddleware(object):

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

def __call__(self, request):
    setattr(request, '_dont_enforce_csrf_checks', True)
    response = self.get_response(request)
    return response
Run Code Online (Sandbox Code Playgroud)

我在myapp / middle.py中创建了此类,然后将该中间件导入了settings.py中的Middleware中。

MIDDLEWARE = [
    'django.middleware.common.CommonMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'myapp.middle.DisableCSRFMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

]
Run Code Online (Sandbox Code Playgroud)

可以在Django 1.11上使用DRF

  • 感谢您为问题提供答案,而不仅仅是发布解决方案。 (2认同)

JJP*_*JJP 5

如果要在Global中禁用它,可以编写自定义中间件,如下所示

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)
Run Code Online (Sandbox Code Playgroud)

然后将此类添加youappname.middlewarefilename.DisableCsrfCheckMIDDLEWARE_CLASSES列表中django.middleware.csrf.CsrfViewMiddleware


Sae*_*eed 5

在使用此解决方案之前,请阅读文档中的此链接


我通过以下两个步骤解决了这个问题:

  1. 将此类添加到文件中utils.py

    from django.utils.deprecation import MiddlewareMixin
    
    from <your-project-name> import settings
    class DisableCSRF(MiddlewareMixin):
       def process_request(self, request):
          if settings.DEBUG:
             setattr(request, '_dont_enforce_csrf_checks', True)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 并在settings.py文件中,将上述中间件添加到列表中MIDDLEWARE

    ...
    MIDDLEWARE = [
        ...
        'django.middleware.csrf.CsrfViewMiddleware',
        ...
        '<path-of-utils.py>.utils.DisableCSRF',
    ]
    ...
    
    Run Code Online (Sandbox Code Playgroud)