Como é que se habilitar a autenticação através de um site Django, e de forma transparente preservar quaisquer dados POST ou GET?

StackOverflow https://stackoverflow.com/questions/583857

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.

Foi útil?

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.

  1. Se não está logado, capturar o GET e POST dados no middleware, e armazená-lo na sessão
  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top