Cuando la API de formulario genera un formulario, también genera un token que se pasa con el formulario en un campo oculto y se espera que se devuelva. Si es así, se procesa el formulario.
Si una forma renderizada se almacena en caché, digamos, por Varnish , este mecanismo se rompe. El primer usuario que envíe el formulario consumirá el token, y los siguientes intentos de usar el formulario serán rechazados.
¿Qué estrategias están disponibles para mantener los formularios funcionando mientras almacenan en caché su forma renderizada?
Respuestas:
Yo uso BOA para mis sitios, pero por defecto BOA simplemente deshabilita el almacenamiento en caché frontal sobre la marcha para la presentación de formularios. Más allá de mi experiencia real, me crucé con un artificial de un año sobre cómo el New Zealand Post trata con Drupal & Varnish y el problema del token de formulario. Santo John Wayne, es una lectura obligada para el almacenamiento en caché de Drupal, realmente. Centrándose solo en el problema del formulario:
También puede deshabilitar los tokens de formulario cuando no se requiere la producción de XSRF en form_alter (unset ($ form ['# token']);) o ($ form ['# token'] = FALSE;)
Un artículo de rendimiento de Acquia Drupal presenta un módulo Drupal Authcache , pero al leer el documento en Authcache, resuelve el almacenamiento en caché con un marcador de posición para el formulario (no almacena en caché el formulario):
La estrategia es almacenar todo menos el formulario . Entonces abordando todo lo demás: ¿Quizás Varnish no se usa en absoluto, Memcache & Redis? Mi estrategia sería usar lo que ofrece BOA porque uso BOA y los asistentes detrás de él ( omega8.cc ) saben mucho más que yo. No creo que haya un caché externo que resuelva el problema. Todos parecen omitir el formulario.
Realice el almacenamiento en caché parcial con la memoria caché mencionada anteriormente y con vistas y paneles finamente modificados como se menciona en el artículo de NZ Post y se describe por la confianza del cerebro en Wunderkraut : es antiguo, pero aborda el problema.
Use el módulo Drupal ESI y Varnish es parcialmente compatible con ESI):
Espero que sea más útil.
fuente
Una posible solución sería deshabilitar todo el token
$form[‘#token’] = FALSE;
, anular la devolución de llamada de envío en lugar de publicar el comentario, regenerar el formulario original con un token y pedirle al usuario que confirme la publicación.Si el usuario admite ECMAScript , se podría mejorar la experiencia del usuario al tener un recurso de servicios que expone la generación de formularios de nuevos tokens de formulario e inserta el formulario relevante en el
form_cache
. Luego, tan pronto como el usuario se concentre en el formulario y, por lo tanto, es probable que desee enviarlo, desactive el botón de envío, busque un nuevo token e insértelo en el formulario ya renderizado, y habilite el botón de envío nuevamente.fuente