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