Quando a API do formulário gera um formulário, ela também gera um token que é distribuído com o formulário em um campo oculto e espera-se retornar. Se for, o formulário é processado.
Se um formulário renderizado estiver sempre em cache, digamos, por Varnish , esse mecanismo será interrompido. O primeiro usuário que enviar o formulário consumirá o token e as tentativas seguintes de usá-lo serão rejeitadas.
Quais estratégias estão disponíveis para manter os formulários funcionando enquanto o cache é processado?
Respostas:
Eu uso o BOA nos meus sites, mas, por padrão, o BOA simplesmente desativa o cache de front-end em tempo real para o envio de formulários. Além da minha experiência real, deparei com uma cruz de um ano de idade artificial sobre como o New Zealand Post lida com Drupal & Varnish e a questão do token de formulário. Santo John Wayne, é uma leitura obrigatória para o cache do Drupal - realmente. Focalizando apenas a questão do formulário:
Você também pode desativar os tokens de formulário quando a produção XSRF não for adquirida em form_alter (desmarcado ($ form ['# token']);) ou ($ form ['# token'] = FALSE;)
Um artigo de desempenho do Acquia Drupal apresenta um Authcache do módulo Drupal , mas, ao ler o documento no Authcache, ele realiza o cache com um espaço reservado para o formulário (sem armazenar o formulário):
A estratégia é armazenar tudo em cache , exceto o formulário . Então, abordando todo o resto: talvez o Varnish não seja usado, Memcache & Redis? Minha estratégia seria usar o que o BOA oferece, porque eu uso o BOA e os assistentes por trás dele ( omega8.cc ) sabem muito mais do que eu. Eu não acho que exista um cache externo que resolva o problema. Todos eles parecem ignorar o formulário.
Faça cache parcial com o authcache acima mencionado e com os Views and Panels aprimorados, como mencionado no artigo da NZ Post e descrito pela confiança no cérebro do Wunderkraut - antigo, mas aborda o problema.
Use o Drupal ESI Module e o verniz é parcialmente compatível com ESI):
Espero que seja mais útil.
fonte
Uma solução em potencial seria desativar o token juntamente com
$form[‘#token’] = FALSE;
, substituir o retorno de chamada de envio para, em vez de realmente postar o comentário, gerar novamente o formulário original com um token e pedir ao usuário para confirmar a postagem.Se o usuário suportar o ECMAScript , é possível melhorar a experiência do usuário com um recurso de serviços que expõe a geração de formulários de novos tokens de formulário e insere o formulário relevante no
form_cache
. Então, assim que o usuário se concentrar no formulário e, portanto, provavelmente quiser enviá-lo, desative o botão de envio, busque um novo token e insira-o no formulário já renderizado e ative o botão de envio novamente.fonte