Come si fa a attivare l'autenticazione attraverso un sito di Django, e in modo trasparente conservare qualsiasi POST o ottenere i dati?

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

Domanda

Supponiamo che qualcuno sta modificando un form HTML, e le loro sessione scade, come si può avere Django riautenticare quell'individuo senza perdere il contenuto che l'utente era entrato in forma?

Il frammento Django Snippets: richiedere il login attraverso intero sito suggerisce come fare sito- autenticazione a livello, ma mi aspetto che perderà la componente GET della stringa (vale a dire, perché request.path non lo include), e sicuramente perdere i dati POST.

Come si può preservare il POST e GET attraverso quelle timeout scomodi. Trovo che finessed siti web tendono a gestire questa situazione in modo intelligente, e mi piacerebbe essere in grado di farlo in Django (come sarebbero altri, immagino!).

I pensieri sarebbe apprezzato. Grazie.

È stato utile?

Soluzione

Ho due suggerimenti.

Redirect / Middleware

Dal momento che si sta già utilizzando il middleware per gestire il requisito di accesso, è possibile modificare questo middleware. O forse, creare un'altra classe middleware che viene chiamato dopo il middleware di accesso. Queste idee si intrecciano in modo che può avere più senso per modificare quella esistente.

  1. Se non accesso, catturare il GET e POST dati nel middleware, e memorizzarlo nella sessione
  2. Se l'utente è autenticato, verificare il valore (s) impostato in 1 #. Se esistono, modificare request.GET e request.POST per riflettere, e cancellare i dati di sessione.

Credo che questo dovrebbe funzionare in modo pulito, e molte persone sarebbe trovare utile. Sarebbe un grande post su djangosnippets.org .

tecnica Ajax

Questo è meno pratico se avete già il vostro modulo di gestione in atto, ma potrebbe creare una migliore esperienza utente. Se pubblichi in modo asincrono, il gestore Javascript potrebbe riconoscere un codice di risposta "login richiesto", e quindi visualizzare una finestra pop-up login richiedente. Al termine, l'utente potrebbe ripresentare la forma.

Altri suggerimenti

Aggiungi gestore onsubmit a tutti i moduli che avrebbe controllato la sessione tramite JS e pronto uso per effettuare il login prima di procedere. Questa forma modo presentare non sarebbe davvero accaduto prima che l'utente è connesso di nuovo.

E assicurarsi di verificare che utenti registrati rimane lo stesso in tutta sessioni.

Non è esattamente Django specifico ma HTTP (The Stateless) specifica ... Nel sistema caso termina nel rilascio reindirizzamento durante la manipolazione POST (passaggio a GET da POST originale) e rischiare perdere dati bisogna memorizzare i dati da qualche parte ( db, memcached, ecc) e portare la chiave sotto cui sono memorizzati essere effettuate tramite autenticazione (o altro processo).

Il più semplice è cookie come richiede zero a cuore la chiave. Il più difficile, ma più a prova di proiettile (contro vasetti cookie lettura Oly) è la chiave per utente URL viene reindirizzato e relè consecutivi da richiesta a richiesta (come SESSIONE in soluzione da quasi dieci anni fa).

Dopo aver finito i dati di autenticazione (o altro processo) (e processo interrotto) può essere scelto dal datastore dalla chiave passata (sia da biscotti, o da variabile richiesta GET).

Non mi piacciono le sessioni in generale, anche se suppongo che con un sito autenticato si sta già utilizzando in modo forse le risposte di cui sopra in forma nel vostro approccio.

Senza sessioni, farei qualcosa di simile a Daniels risposta, vale a dire prendere il post originale / GET nel middleware, ma mi piacerebbe cambiare il reindirizzamento per includere le informazioni pubblicate.

Questo è più facile su GET e normalmente è solo l'GetString pieno codificato in un componente di reindirizzamento di URL di accesso.

Per i posti è possibile convertire il metodo get che funziona bene per le forme più piccole, ma per le forme più grandi che renderebbero l'url troppo a lungo, mi piacerebbe fare un repost, la pubblicazione dei dati su un form di login, eventualmente codificate e riporlo in un unico nascosto (quasi come un viewstate .net in realtà)

Fare questo in Django è difficile in quanto non si può fare un redirect, quindi mi piacerebbe usare il middleware per richiamare manualmente la vista di login, e scrivere HttpResponse da lì. MODIFICARE Dopo un po 'più alla ricerca in questo, a quanto pare il lato amministratore magia fo Django ha qualcosa di simile già realizzato, come si trova da Jerry Stratton

Sembra una buona opzione. Cercherò fuori e feedback.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top