disable csrfmiddlewaretoken csrf_token python django

python - csrfmiddlewaretoken - get csrf token django



¿Cómo deshabilitar la validación CSRF de Django? (9)

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

Comenté 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 ?


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 Luego importé 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


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


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.


Para 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 corresponda (en su configuración de prueba, por ejemplo).

Nota: la configuración ya no se llama MIDDLEWARE_CLASSES .


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


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


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)

a continuación, agregue esta clase youappname.middlewarefilename.DisableCsrfCheck a MIDDLEWARE_CLASSES listas, antes de django.middleware.csrf.CsrfViewMiddleware


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í: