¿Cómo se puede habilitar la autenticación a través de un sitio de Django, y preservar de forma transparente cualquier POST o GET datos?

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

Pregunta

Supongamos que alguien está editando un formulario HTML, y sus tiempos de espera de la sesión, ¿cómo se puede tener Django re-autenticar ese individuo sin perder el contenido que el usuario ha entrado en la forma?

El fragmento Django Fragmentos: Solicite su contraseña a través de todo el sitio sugiere cómo hacer sitio- autentificación de ancho, pero espero que perderá el componente GET de la cadena (es decir, debido a request.path no lo incluye), y definitivamente perder los datos POST.

¿Cómo se puede preservar la POST y GET a través de los tiempos de espera de inconvenientes. Encuentro que finessed sitios web tienden a manejar esto de forma inteligente, y me gustaría ser capaz de hacerlo en Django (como serían otros, yo imaginar!).

serían apreciados pensamientos. Gracias.

¿Fue útil?

Solución

Tengo dos sugerencias.

redirección / Middleware

Dado que ya está usando el middleware para manejar el requisito de inicio de sesión, podría modificar este middleware. O, posiblemente, crear otra clase de middleware que se llama después de que el middleware de inicio de sesión. Estas ideas están entrelazados por lo que puede tener más sentido de modificar la existente.

  1. Si no se haya identificado, capturar el GET y POST de datos en el middleware, y almacenarlo en la sesión
  2. Si el usuario es autenticado, comprobar el valor (s) establecido en # 1. Si es que existen, modificar y request.GET request.POST a la reflejan, y borrar los datos de la sesión.

Creo que esto debería funcionar limpiamente, y mucha gente le resultaría útil. Sería un gran puesto en djangosnippets.org .

técnica Ajax

Esto es menos práctico si ya tiene el manejo de su forma en su lugar, pero podría crear una mejor experiencia de usuario. Si publica de forma asíncrona, el controlador Javascript podía reconocer un código de respuesta "requiere inicio de sesión", y luego mostrar un inicio de sesión solicitando diálogo emergente. Al finalizar, el usuario puede volver a enviar el formulario.

Otros consejos

Añadir manejador onsubmit a todas sus formas que comprobaría sesión a través de JS y el uso rápido para iniciar sesión antes de continuar. Esta forma presentara manera realmente no iba a pasar antes que el usuario se registra de nuevo.

Y asegúrese de comprobar que se haya identificado el usuario sigue siendo el mismo a través de sesiones.

No es exactamente Django-específico, sino HTTP (El estado) específico ... En el sistema de casos termina en la emisión de redirección durante la manipulación de la POST (conmutación para llegar de post original) y correr el riesgo de perder datos hay que almacenar los datos en alguna parte ( db, memcached, etc.) y hacer que la llave bajo el que están almacenados se llevarán a través de la autenticación (u otro proceso).

El más simple es la galleta que requiere cero atención acerca de la clave. El más difícil, pero más a prueba de balas (contra tarros de galletas lectura oly) es clave en la URL de usuario es redirigido a relé y consecutiva de una petición a (como SESIÓN en solución de hace casi una década).

Al terminar los datos de autenticación (u otro proceso) (y el proceso interrumpido) se pueden seleccionar de almacén de datos por la clave de pasado (ya sea de cookies, o de variable de petición GET).

No me gustan las sesiones en general, aunque supongo que con un sitio autenticado ya está utilizando ellas así que tal vez las respuestas anteriores encajan en su enfoque.

Sin sesiones, me gustaría hacer algo similar a la respuesta Daniels, es decir, coger el post original / GET en el middleware, pero me gustaría cambiar la redirección de incluir la información publicada.

Esto es más fácil de GET y normalmente se acaba el GetString completa codificada en un componente de redirección de la URL de inicio de sesión.

Para los puestos se puede convertir a cualquiera el método get que funciona muy bien para las formas más pequeñas, pero para las formas más grandes que harían que la url demasiado tiempo, lo haría un repost, la publicación de los datos en un formulario de acceso posiblemente codificada y su almacenamiento en un solo oculta (casi como un estado de vista .net en realidad)

Hacer esto en Django es complicado, ya que no se puede hacer una redirección, por lo que haría uso del middleware para llamar manualmente la vista de inicio de sesión, y escribir a HttpResponse desde allí. EDITAR Después de un poco más de mirar en esto, al parecer, la parte de administración magia fo Django tiene algo similar ya en marcha, tal como se encuentra por Jerry Stratton

Parece una buena opción. Voy a probarlo y retroalimentación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top