Empêcher plusieurs soumissions de formulaire dans Django
Je suis à la recherche d'une méthode générique pour empêcher plusieurs soumissions de formulaire. J'ai trouvé ce approche qui a l'air prometteur. Alors que je ne veux pas inclure cet extrait de mon point de vue. C'est probablement plus facile de le faire avec une demande de processeur ou d'un middleware.
Toutes les recommandations de meilleures pratiques?
Vous pouvez créer un formulaire de base de la classe à laquelle tous vos formes hériter de ce qui pourrait effectuer la séance de vérifier coutumier de la validation de la méthode de manière à ce formulaire.valide() retourne false si l'utilisateur a déjà saisi les données dans le formulaire.
Je ne comprends pas que le gist. Ce n'est pas la mise à jour de la séance.
Vous êtes de droite. La partie où la séance doit être mise à jour n'est pas montré. Mais comme il l'a crée une table de hachage-chaîne basée sur le jeton csrf, qui doit être défini dans la requête GET, il fonctionnera probablement.
Je ne comprends pas que le gist. Ce n'est pas la mise à jour de la séance.
Vous êtes de droite. La partie où la séance doit être mise à jour n'est pas montré. Mais comme il l'a crée une table de hachage-chaîne basée sur le jeton csrf, qui doit être défini dans la requête GET, il fonctionnera probablement.
OriginalL'auteur Thomas Kremmel | 2013-03-27
Vous devez vous connecter pour publier un commentaire.
Côté Client, démarrez avec le JavaScript. Vous ne pouvez jamais faire confiance le client, mais c'est un début.
c'est à dire
Côté serveur vous "pourrait" insérer quelque chose dans une base de données c'est à dire une somme de contrôle. Si ses enregistrements que vous insérez dans une base de données à utiliser
model.objects.get_or_create()
à la force de l'unicité sur le niveau de base de données, vous devez utiliser unique_together.Enfin: HTTPRedirect est la meilleure, La méthode que j'utilise lorsque l'utilisateur un processus de paiement est de simplement émettre un HTTPRedirect() à la merci/conformation de la page. De cette façon, l'actualisation de la forme de ne pas soumettre de nouveau et s'ils revenir en arrière et essayer de soumettre à nouveau le formulaire (sans actualisation de la forme) le Django Cross Site Request Forgery (CSRF) échouera, parfait!
..ce qui est normal puisque l'utilisateur doit être en mesure de créer des tâches avec par exemple le même nom. Pas besoin de base de données unique. La seule approche valable pour ce cas, peut-être le javascript approche qui je vais donner un essai.
Finalement, j'ai réalisé plusieurs de soumission de formulaire à l'aide de angular.js. Voir cette question pour plus de détails: stackoverflow.com/questions/15807471/...
Ne HTTPRedirect et CSRF vraiment de travail pour éviter un utilisateur en appuyant sur le bouton de retour et de poster le formulaire à nouveau? Parce que je pense que je suis en train de l'essayer, mais il ne fonctionne pas. Voir mon post stackoverflow.com/questions/20412818/...
Ce n'est pas assez de travail comme lorsque vous désactivez le bouton soumettre navigateur annule la forme submittion
OriginalL'auteur Glyn Jackson
J'ai aussi essayer de trouver un bon moyen de prévenir les enregistrements en double génération lorsqu'un utilisateur double-cliquez sur un bouton de soumission.
Il n'est pas sur le PRG problème est facilement résolu par la redirection.
Donc, en ce qui concerne cette préoccupation fondamentale, la solution avec HTTPRedirect sur le côté serveur ne l'aide pas.
Sur le côté client, j'ai trouvé deux problèmes lorsque je désactive le bouton avant de soumettre:
form.submit()
sera interrompu par navigateur si le formulaire n'est pas valide => bouton envoyer est encoredisabled=true
.disabled=true
.Donc, voici ma solution de contournement pour le premier côté client, le problème (la validation HTML5):
J'essaie de trouver un client-side solution de contournement pour le deuxième côté client (problème de cache navigateur les DOM), mais rien n'a fonctionné (onbeforeunload, ...).
Donc la solution que j'utilise actuellement pour "le cache du navigateur" problème est d'ajouter un @never_cache décoration sur le dessus de vues (du côté serveur, indiquez à côté client pour en cache pas). S'il vous plaît laissez-moi savoir si vous avez une meilleure solution.
Dernier mais non le moins, je voudrais vraiment l'apprécier pour résoudre ce problème côté serveur.
Les CSRF solution semble pas adapté depuis un Jeton CSRF est généré par session (pas pour chaque forme).
Voici donc l'état de mon travail et de ma question:
Laissez-moi savoir si vous avez une bonne solution pour cela.
Edit 1:
Peut-être une petite partie de la réponse: Synchronisateur (ou du Déjà vu) Jeton
Mais je ne trouve pas de mise de que dans Django.
Pour le serverside, comment sur l'écriture de middleware qui hache le POST de données et met en cache pour un court laps de temps?
OriginalL'auteur Gosti
Utilisation HttpResponseRedirect
créer une nouvelle vue(disons
thank_you
) pour la réussite de message à afficher après la soumission du formulaire et le retourner d'un modèle.Après le succès de l'envoi du formulaire ne retour HttpResponseRedirect("/merci/") pour les nouveaux merci de vue
et dans urls.py
Multiples formulaire de soumission parce que quand la page se rafraîchit la même url hits, qui exigent que même point de vue, encore et encore, et donc plusieurs entrées enregistrées dans la base de données. Pour éviter cela, nous sommes tenus de rediriger la réponse à la nouvelle url de la vue, de sorte que la prochaine fois, la page s'actualise, il sera frappé de cette nouvelle url/view.
OriginalL'auteur Bhavana Singh Nayak
Comme pour le #2, il est préférable de le faire dans la
onsubmit
de gestionnaire et de ne pas leonclick
pour le bouton soumettre. Cela permettra de s'occuper des cas comme plusieurs boutons de soumission ou si il y a d'HTML5 côté client de la validation du formulaire. En jQuery, il serait quelque chose comme:Cependant, un problème ce ne tient pas compte est que si l'utilisateur annule la soumission de la partie. Par exemple, si vous cliquez sur "envoyer", puis cliquez immédiatement sur "Esc", le navigateur va arrêter la présentation, mais le bouton "soumettre" sera déjà désactivé.
Aussi, il est possible d'avoir un formulaire est soumis par la touche "entrée" et cette solution ne serait pas de prévenir cette forme de soumettre deux fois.
OriginalL'auteur Tim Tisdall