2010-07-20 14 views
24

dentro de mi aplicación django Estoy almacenando cadenas de html en el db que luego se mostrarán en las páginas de inicio de los usuarios como "mensajes". Algunos de estos mensajes contienen formularios, pero no están escritos en el idioma de la plantilla, no puedo insertar el token csrf (rompiendo así la aplicación).¿Cómo puedo integrar el token django csrf directamente en HTML?

¿Hay alguna manera de insertar este token directamente desde dentro de los archivos python que estoy editando? Estoy buscando algo en la línea de:

csrf_token = django.csrf.generate() 
message = "press the button please: <form><input type='hidden' name='csrf_token' value='%s'><input type='submit' value='press here'></form>" % (csrf_token) 

cualquier otra solución que funcionaría en un escenario similar sería genial. Gracias

Editar: En realidad eso no va a funcionar porque el token es diferente para cada sesión, por lo que su almacenamiento en la base de datos no es muy útil. ¿Hay alguna forma de cargar dinámicamente el token dentro de la vista?

+0

¿Qué quiere decir por 'cargar dinámicamente el token dentro de la vista'? –

+0

el formulario se almacena como una cadena en la base de datos, de modo que si almaceno el token allí, no será válido tan pronto como se cargue en una nueva sesión. Si fuera posible cargar un nuevo token desde el interior de la vista, podría interceptar el html tal como se estaba procesando, insertar el token apropiado y mostrar el formulario de trabajo. La clave aquí es que no voy a pasar por una plantilla para insertar el token. ¿Eso lo hace más claro? – ergelo

+0

¿no puede simplemente usar el decorador csrf_protect? – sureshvv

Respuesta

42

Llame al django.middleware.csrf.get_token(request) para obtener el token CSRF.

+1

que lo habría resuelto. ¡Gracias por mencionarlo! – ergelo

+0

¿Funciona esto al colocar el token en una entrada oculta? Debido a que sigo recibiendo el mismo error, ¿cuál sería la mejor manera de poner esta ficha en el formulario? –

+0

Una buena solución para mí fue utilizar el nombre "csrfmiddlewaretoken" en lugar de "csrf_token" –

17

La manera de usarlo, es para usarlo directamente en las plantillas.

De the documentation,:

<form action="" method="post"> 
{% csrf_token %} 

es todo lo que tiene que incluir.

+0

gracias. el problema es que el 'mensaje' se crea en una vista y se almacena en la base de datos sin pasar por una vista. Resolveré el problema girando el botón de formulario en un enlace y pasando por una vista para eludir el csrf. – ergelo

+8

la pregunta es para el caso donde no se usan las plantillas de django –

+0

¡Esto lo resolvió durante la instalación de Django-CMS! Por alguna razón, no iniciaría sesión sin este token en la única plantilla que tenía. Extraño. – MadPhysicist

10

La respuesta aceptada asume que el token ya está establecido en el objeto de solicitud.

Tal vez algo como esto es mejor:

from django.middleware import csrf 
def get_or_create_csrf_token(request): 
    token = request.META.get('CSRF_COOKIE', None) 
    if token is None: 
     token = csrf._get_new_csrf_key() 
     request.META['CSRF_COOKIE'] = token 
    request.META['CSRF_COOKIE_USED'] = True 
    return token 
+0

gracias. esto funciona para mi – wildcolor

+0

no debería usar API internas y, de hecho, _get_new_csrf_key() ya no existe en Django. deberías usar get_token(). – interDist