Hay un django.middleware.csrf.CsrfViewMiddleware
middleware 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:
- En
MIDDLEWARE_CLASSES
adicióndjango.middleware.csrf.CsrfViewMiddleware
, la protección CSRF global abierta. - Para el formulario de POST a la estación
<form>
, agregue una{% csrf_token %}
etiqueta de plantilla a la etiqueta en la plantilla. - Asegúrese de utilizar el
django.template.context_processors.csrf
procesador de contexto en la función de vista correspondiente . Hay dos formas de lograrlo:
(1) UseRequestContext
o use directamente la vista común, se agregarán automáticamentecsrf_token
al 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 RequestContext
no es bueno para usar , y la documentación de Django 1.8 establece que context_instance
se descartará después de 1.8.
¿Cómo debemos lidiar con csrf_token
eso? De hecho, Django proporciona una función de acceso directo para tratar este problema. Un ejemplo de
django.shortcuts.render
configuración interna context_instance
predeterminada RequestContext
. La llamada render
se puede csrf_token
agregar automáticamente al contexto.
Hay algunos blogs en Internet que se pueden settings
configurar para TEMPLATE_CONTEXT_PROCESSORS
lograr un csrf_token
relleno 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 settings
configuré así:
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
'django.core.context_processors.csrf',
)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
自此了解到要想django自带的csrf组件生效,要满足以上三个条件
- En
MIDDLEWARE_CLASSES
adicióndjango.middleware.csrf.CsrfViewMiddleware
, la protección CSRF global abierta. - Para el formulario de POST a la estación
<form>
, agregue una{% csrf_token %}
etiqueta de plantilla a la etiqueta en la plantilla. - Vista de renderizado con función de renderizado