Question

I am submitting a form. After that i am doing HttpResponseRedirect so that the form wont be submitted if one i refresh the page. BUT, if i go back in browser and submit the form again, the form will be saved multiple times. How can i prevent this?

I thought of session, meaning i set a session name like this:

if request.session.get('saved', False):
    return HttpResponseRedirect('/already_saved/')    
entry.save() # <-- pseudo save
request.session['saved'] = True

but this causes that the user can never send another form in my page in his actual session.

how can I create unique sessions for each form, so that one form doesnot get submitted multiple times but it is still possible to submit another forms?

Was it helpful?

Solution

An approach would be making a hash of the form's field and when the server receives the request you check if the hash of the form is already there (e.g. form already submitted). Something like this:

import hashlib
from django.shortcuts import Http404
sha512 = hashlib.sha512()
sha512.update(form_fields_stringfied)

if not request.session['forbidden_data']:
    request.session['forbidden_data'] = []

hashed_form = sha512.hexdigest()
if hashed_form not in request.session['forbidden_data']:
    request.session['forbidden_data'].append(hashed_form)
else:
    raise Http404

where hashed_form is the form data concatenated or in anyway you like

thus, no two forms considered equal will ever be submitted

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top