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.
Gegenmaßnahmen gegen die doppelte Einreichung von Saikyo
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
In der Probe ist der Fluss wie folgt.
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>
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