La double soumission signifie que la même demande sera envoyée plusieurs fois. Si le traitement effectué lors de la réception d'une demande POST est exécuté plusieurs fois, un traitement inattendu peut être effectué. Cela peut également être causé par le bouton de rechargement du navigateur, il est donc souhaitable de prendre certaines mesures.
Contre-mesures contre la double soumission de Saikyo
J'ai cherché patiemment, mais cela ne semblait pas être le cas, alors je l'ai fait moi-même facilement. Il s'agit d'un double jugement de soumission côté serveur et non côté client, comme la désactivation des boutons.
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
Dans l'échantillon, le flux est le suivant.
Dans exist_submit_token (), submit_token utilisé une fois est écarté de la session par pop, donc si la même requête est envoyée plusieurs fois, error.html sera retourné.
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>
Je voudrais utiliser une méthode plus simple et plus facile à comprendre, mais j'ai une fois compromis avec l'implémentation ci-dessus. De plus, comme SessionToken dans Struts2, je voudrais pouvoir dire que le même écran sera retourné même après la deuxième fois et les suivantes de la même demande, bien qu'il ne soit pas traité. Si vous avez une bonne bibliothèque, ou si vous voulez faire quelque chose comme ça, faites-le nous savoir dans les commentaires.
Recommended Posts