Pregunta ¿Cómo deshabilitar la validación CSRF de Django?


He comentado líneas de procesador csrf y middleware en 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 )

Pero cuando uso Ajax para enviar una solicitud, Django aún responde que 'csrf token es incorrecto o falta', y luego de agregar X-CSRFToken a los encabezados, la solicitud tendría éxito.

Que esta pasando aqui ?


73
2018-05-09 09:07


origen


Respuestas:


Si solo necesita algunas vistas para no usar CSRF, puede usar @csrf_exempt:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')

Puede encontrar más ejemplos y otros escenarios aquí:


155
2018-05-09 09:10



Para desactivar CSRF para vistas basadas en clases, lo siguiente funcionó para mí.
Usando django 1.10 y 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')

20
2017-10-12 07:57



La respuesta puede ser inapropiada, pero espero que te ayude

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

Tener un middleware como este ayuda a depurar las solicitudes y verificar csrf en los servidores de producción.


9
2018-06-04 08:50



Si desea deshabilitarlo en Global, puede escribir un middleware personalizado, como este

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)

luego agrega esta clase youappname.middlewarefilename.DisableCsrfCheck a MIDDLEWARE_CLASSES listas, antes django.middleware.csrf.CsrfViewMiddleware


5
2018-05-08 07:24



Puede desactivar el CSRF para crear su propio middleware:

Haga una aplicación de django con el nombre 'Core', y haga un archivo 'utils.py' en esta aplicación y colóquelo debajo del código en este archivo:

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

E incluya este middleware en su archivo settings.py en MIDDLEWARE_CLASSES.

'core.utils'

Una forma más: 

puedes usar @csrf_exempt decorator

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

4
2017-09-04 10:22



por Django 2:

from django.utils.deprecation import MiddlewareMixin


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

Ese middleware debe agregarse a settings.MIDDLEWARE cuando sea apropiado (en su configuración de prueba, por ejemplo).

Nota: la configuración no se llama MIDDLEWARE_CLASSES nunca más.


3
2017-12-22 13:07



CSRF se puede aplicar en el nivel de vista, que no se puede deshabilitar globalmente.

En algunos casos esto es un dolor, pero um, "es por seguridad". Tengo que mantener esas calificaciones AAA.

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


1
2018-04-02 05:31



En setting.py en MIDDLEWARE puedes simplemente eliminar esta línea, 'django.middleware.csrf.CsrfViewMiddleware',


1
2018-03-28 08:36



El problema aquí es que SessionAuthentication realiza su propia validación CSRF. Es por eso que obtienes el error CSRF que falta aun cuando se comente el Middleware CSRF. Puede agregar @csrf_exempt a cada vista, pero si desea deshabilitar CSRF y tener autenticación de sesión para toda la aplicación, puede agregar un middleware adicional como este:

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

Creé esta clase en myapp / middle.py A continuación, importe este middleware en Middleware en settings.py

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',

]

Eso funciona con DRF en django 1.11


1
2017-12-19 14:04