Para rest_framework, el componente csrf que viene con django no tiene efecto

Hay un django.middleware.csrf.CsrfViewMiddlewaremiddleware en Django que proporciona una comprobación global de csrf. Su principio es <form>generar una etiqueta oculta en la <input>etiqueta, enviarla oculta al enviar el formulario, <input>y el servidor verifica que este campo sea correcto.

Los pasos oficiales de la operación csrf son:

  1. En MIDDLEWARE_CLASSESadición django.middleware.csrf.CsrfViewMiddleware, la protección CSRF global abierta.
  2. Para el formulario de POST a la estación <form>, agregue una {% csrf_token %}etiqueta de plantilla a la etiqueta en la plantilla.
  3. Asegúrese de utilizar el django.template.context_processors.csrfprocesador de contexto en la función de vista correspondiente . Hay dos formas de lograrlo:
    (1) Use RequestContexto use directamente la vista común, se agregarán automáticamente csrf_tokenal contexto de la plantilla.
    devuelva render_to_response ("xxx.html", context_instance = RequestContext (request))
    (2). Importe y use manualmente el procesador para generar el token CSRF y agregarlo al contexto de la plantilla. Por ejemplo:
    desde django.shortcuts import render_to_response
    desde django.template.context_processors import csrf
    def my_view (request):
    c = {}
    c.update (csrf (request))
    # ... ver código aquí
    devuelve render_to_response ("a_template.html" c)

Sin embargo, la importación manual es engorrosa y hace que el código sea difícil de mantener, y RequestContextno es bueno para usar , y la documentación de Django 1.8 establece que context_instancese descartará después de 1.8.
¿Cómo debemos lidiar con csrf_tokeneso? De hecho, Django proporciona una función de acceso directo para tratar este problema. Un ejemplo de
django.shortcuts.renderconfiguración interna context_instancepredeterminada RequestContext. La llamada renderse puede csrf_tokenagregar automáticamente al contexto.


Hay algunos blogs en Internet que se pueden settingsconfigurar para TEMPLATE_CONTEXT_PROCESSORSlograr un csrf_tokenrelleno global al contexto.
Pero después de mi experimento, descubrí que no es fácil de usar. Si un amigo sabe el motivo, también me gustaría informarle.

Lo settingsconfiguré así:

TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (    
    'django.core.context_processors.csrf',
)


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
自此了解到要想django自带的csrf组件生效,要满足以上三个条件
  1. En MIDDLEWARE_CLASSESadición django.middleware.csrf.CsrfViewMiddleware, la protección CSRF global abierta.
  2. Para el formulario de POST a la estación <form>, agregue una {% csrf_token %}etiqueta de plantilla a la etiqueta en la plantilla.
  3. Vista de renderizado con función de renderizado
  4. El framework framework rest es un proyecto que separa el front end y el back end. El resultado devuelto es devuelto por Response, por lo que el componente csrf que viene con django no tiene efecto , por lo que el componente de autenticación del framework rest se usa para la autenticación de token, lo que explica mi confusión. ¿Por qué el resto del marco de trabajo solicita que el ciclo de vida pase a través del middleware django y también a través del componente csrf de django? ¿Por qué necesitamos escribir componentes de autenticación nosotros mismos? ¿Por qué no usar django?

Supongo que te gusta

Origin www.cnblogs.com/python001-vip/p/12676333.html
Recomendado
Clasificación