Como é que se habilitar a autenticação através de um site Django, e de forma transparente preservar quaisquer dados POST ou GET?
-
06-09-2019 - |
Pergunta
Suponha que alguém está editando um formulário HTML, e seus tempos de espera da sessão, como se pode ter Django reautenticar que o indivíduo sem perder o conteúdo que o usuário tinha entrado em forma?
O trecho Django Snippets: requer login em todo local sugere como fazer site- autenticação de largura, mas espero que ele vai perder o componente GET da cadeia (ou seja, porque request.path não inclui-lo), e definitivamente perder os dados POST.
Como se pode preservar o GET e POST através daqueles tempos limites inconvenientes. Acho que web-sites finessed tendem a lidar com isso de forma inteligente, e eu gostaria de ser capaz de fazê-lo em Django (como seria demais, eu imagino!).
Os pensamentos seria apreciada. Obrigado.
Solução
Eu tenho duas sugestões.
Redirect / Middleware
Uma vez que você já está usando middleware para lidar com a exigência de login, você pode modificar este middleware. Ou possivelmente, criar outra classe middleware que é chamado após o middleware login. Essas idéias estão interligados por isso pode fazer mais sentido para modificar o existente.
- Se não está logado, capturar o GET e POST dados no middleware, e armazená-lo na sessão
- Se o usuário é autenticado, verifique o valor definido (s) no nº 1. Se eles existem, modificar request.GET e request.POST para refletir isso, e apagar os dados da sessão.
Eu acho que isso deve funcionar de forma limpa, e muitas pessoas acham útil. Seria um ótimo post sobre djangosnippets.org .
Ajax técnica
Este é menos prático se você já tem a sua forma de lidar no lugar, mas poderia criar uma experiência de usuário melhor. Se você postar de modo assíncrono, o manipulador Javascript poderia reconhecer um "login necessário" código de resposta e, em seguida, exibir um login solicitando diálogo pop-up. Na conclusão, o usuário pode submeter novamente o formulário.
Outras dicas
Adicionar manipulador onsubmit
a todas as suas formas que gostaria de verificar sessão via JS e uso imediato fazer o login antes de prosseguir. Esta forma maneira submeter realmente não iria acontecer antes usuário está conectado novamente.
E certifique-se de verificar se logado estadias usuário o mesmo em sessões.
Não é exatamente específica Django, mas HTTP (O Stateless) específico ... Nos confins do sistema caso na emissão Redirect ao manusear POST (comutação para começar a partir POST original) e correr o risco de dados perdendo um deve armazenar a algum lugar de dados ( db, memcached, etc.) e fazer a chave sob a qual eles são armazenados ser realizada por meio de autenticação (ou outro processo).
O mais simples é cookie como exige zero de cuidados sobre a chave. A bala à prova mais difícil, mas mais (contra potes de biscoito leitura Oly) é fundamental para usuário URL é redirecionado para e relé consecutivo de solicitação para solicitação (como SESSÃO em solução de quase dez anos atrás).
Ao terminar os dados de autenticação (ou outro processo) (e processo interrompido) pode ser escolhido a partir de armazenamento de dados pela chave passados ??(a partir de Cookies, ou a partir de GET variável pedido).
Eu não gosto de sessões em geral, embora eu suponho que com um site autenticado você já está usando-os então talvez as respostas acima se encaixam em sua abordagem.
Sem sessões, eu faria algo semelhante a resposta Daniels, ou seja, pegar o post original / GET no middleware, mas eu mudaria o redirecionamento para incluir a informação postada.
Esta é mais fácil em GETs e normalmente é apenas o getString completo codificado em um componente de redirecionamento do URL de login.
Para mensagens que você pode converter para o método get que funciona bem para formas menores mas para formas maiores que fariam a url muito tempo, eu faria um repost, registrando os dados em um formulário de login, possivelmente codificado e armazená-lo em uma única escondida (quase como um .net viewstate realmente)
Fazer isso no Django é complicado porque você não pode fazer um redirecionamento, então eu usar o middleware para chamar manualmente o ponto de vista login, e escrever para HttpResponse de lá. EDITAR Depois de um pouco mais olhando para isso, aparentemente, lado a magia administrador fo Django tem algo semelhante já implementadas, como encontrado por Jerry Stratton
Parece uma boa opção. Vou testá-lo e feedback.