[PYTHON] Doppelte Submit-Unterdrückung mit Django

Was ist Double Submit / Double Transmission?

Doppelte Übermittlung bedeutet, dass dieselbe Anfrage mehrmals gesendet wird. Wenn die Verarbeitung, die beim Empfang einer POST-Anforderung ausgeführt wird, mehrmals ausgeführt wird, kann eine unerwartete Verarbeitung durchgeführt werden. Dies kann auch durch die Schaltfläche zum erneuten Laden des Browsers verursacht werden. Daher ist es wünschenswert, einige Maßnahmen zu ergreifen.

Referenz

Gegenmaßnahmen gegen die doppelte Einreichung von Saikyo

Hat Django eine Funktion zum doppelten Senden von Gegenmaßnahmen?

Ich suchte geduldig, aber es schien nicht so zu sein, also machte ich es mir leicht. Es handelt sich um eine doppelte Übermittlungsbeurteilung auf der Serverseite, nicht auf der Clientseite, wie z. B. die Deaktivierung von Schaltflächen.

def set_submit_token(request):
    submit_token = str(uuid.uuid4())
    request.session['submit_token'] = submit_token
    return submit_token

def exists_submit_token(request):
    token_in_request = request.POST.get('submit_token')
    token_in_session = request.session.POP('submit_token', '')

    if not token_in_request:
        return False
    if not token_in_session:
        return False

    return token_in_request == token_in_session

Wie benutzt man

In der Probe ist der Fluss wie folgt.

  1. (Server-> Client) -Index Halten Sie submit_token in der Sitzung, wenn Sie auf den Bildschirm zugreifen, und übergeben Sie ihn gleichzeitig an den Client.
  2. (Client-> Server) Fügen Sie submit_token in die Anforderung ein, wenn die Senden-Schaltfläche auf dem Indexbildschirm gedrückt wird.
  3. (Server) Überprüfen Sie, ob sich submit_token in der Sitzung befindet

In exist_submit_token () wird einmal verwendetes submit_token von pop aus der Sitzung verworfen. Wenn dieselbe Anforderung also mehrmals gesendet wird, wird error.html zurückgegeben.

views.py


def index(request):
    submit_token = set_submit_token(request)
    return render(request, 'todo/index.html', {"submit_token": submit_token})

def post(request):
    if not exists_submit_token(request):
        return render(request, 'todo/error.html', {})
    else:
        return render(request, 'todo/complete.html', {})

index.html


<form action="{% url 'todo:post' %}" method="post">
{% csrf_token %}
{{ submit_token }}
<input type="hidden" name="submit_token" value="{{ submit_token }}" />
<input type="submit" value="Submit" />
</form>

Schließlich

Ich würde gerne eine einfachere und verständlichere Methode verwenden, habe aber einmal einen Kompromiss mit der obigen Implementierung eingegangen. Ebenso wie SessionToken in Struts2 möchte ich sagen können, dass genau derselbe Bildschirm auch nach dem zweiten und nachfolgenden Mal derselben Anforderung zurückgegeben wird, obwohl er nicht verarbeitet wird. Wenn Sie eine gute Bibliothek haben oder so etwas tun möchten, teilen Sie uns dies bitte in den Kommentaren mit.

Recommended Posts

Doppelte Submit-Unterdrückung mit Django
Internationalisierung mit Django
CRUD mit Django
Authentifizieren Sie Google mit Django
Django 1.11 wurde mit Python3.6 gestartet
Laden Sie Dateien mit Django hoch
Entwicklungsverdauung mit Django
Verwenden Sie Gentelella mit Django
Twitter OAuth mit Django
Erste Schritte mit Django 1
Mail mit Django senden
Datei-Upload mit Django
Verwenden Sie WENIGER mit Django
Pooling mechanisieren mit Django
Verwenden Sie MySQL mit Django
Django ab heute
Erste Schritte mit Django 2
Mach Django mit CodeStar (Python3.6.8, Django2.2.9)
Fangen Sie mit Django an! ~ Tutorial ⑤ ~
Minimale Konfigurations-Website-Umgebung mit Django
Erstellen Sie eine API mit Django
Mach Django mit CodeStar (Python3.8, Django2.1.15)
Stellen Sie Django serverlos mit Lambda bereit
Python3 + Django ~ Mac ~ mit Apache
Erste Schritte mit Python Django (1)
Erstellen Sie eine Homepage mit Django
Fangen Sie mit Django an! ~ Tutorial ④ ~
Erstellen Sie eine Webanwendung mit Django
Erste Schritte mit Python Django (3)
Kombinieren Sie Fast API mit Django ORM
Fangen Sie mit Django an! ~ Tutorial ⑥ ~
Verwenden Sie Django, um Tweet-Daten zu speichern
Führen Sie eine AES-Verschlüsselung mit DJango durch
Einführung in Python Django (6)
Kombiniere zwei Bilder mit Django
Erste Schritte mit Django mit PyCharm
Echtzeit-Web mit Django-Kanälen
Django REST Framework mit Vue.js
Verwenden Sie prefetch_related bequem mit Django
Erste Schritte mit Python Django (5)
Melden Sie sich mit dem Django Rest Framework an
Qiita API Oauth mit Django
Testgetriebene Entwicklung mit Django Teil 3
Laden Sie die Django-Shell mit ipython neu
Schritte zur Entwicklung von Django mit VSCode
Testgetriebene Entwicklung mit Django Teil 4
Verhindern Sie den doppelten Start des Befehls django
Laden Sie ein Django-Modul mit einem Interpreter
Richten Sie mit Django ein soziales Login ein
Testgetriebene Entwicklung mit Django Teil 6
Messen Sie die Abdeckung der Django-Anwendung mit Coverage.py
Behandeln Sie CSV-Dateien mit Django (Django-Import-Export)
HTTPS mit Django und Let's Encrypt
Verwalten Sie Django-Konfigurationsdateien mit Python-Decouple
Stellen Sie die Django-Anwendung mit Docker bereit
Standardisieren Sie HTML, um mit Django gemietet zu werden
Linke äußere Verbindung im Django-Modell
Testgetriebene Entwicklung mit Django Teil 2
Django-Tipps - Erstellen Sie eine Ranking-Site mit Django-
Twitter-Posting-Anwendung mit Django gemacht
Generieren Sie automatisch ein Modellbeziehungsdiagramm mit Django