Один из способов сделать это - установить начальное значение времени, скажем, 0, и обновить его до текущей отметки времени после проверки формы, и проверять отметку времени только тогда, когда она не равна 0:
class MyForm(forms.Form):
timestamp = forms.IntegerField(widget=forms.HiddenInput, initial=0)
#look at the initial = 0
security_hash = forms.CharField(min_length=40, max_length=40, widget=forms.HiddenInput)
def clean_timestamp(self):
"""Make sure the delay is over (5 seconds)."""
ts = self.cleaned_data["timestamp"]
if timestamp != 0 and not time.time() - ts > 5:
raise forms.ValidationError("Timestamp check failed")
return ts
def clean(self):
cleaned_data = self.cleaned_data
if len(self._errors) == 0: #it validates
cleaned_data["timestamp"] = time.time()
return cleaned_data
Другим возможным решением является использование сессий . Это безопаснее, но не пуленепробиваемый. В предыдущем приложении пользователь может отправлять одни и те же данные сообщения несколько раз, и форма будет проверяться несколько раз (поскольку он отправляет одну и ту же метку времени). В сеансах необходимо, чтобы у пользователя были включены файлы cookie, но он не сможет отправлять данные публикации, которые проверяются быстрее, чем через 5 секунд.
Таким образом, после правильной отправки формы вы можете сэкономить время в ключе сеанса пользователя и проверить его перед повторной проверкой формы. Это легко сделать в представлении. Если вы хотите сделать это на уровне логики формы, вам нужно создать собственный чистый метод в форме, которая принимает запрос (чтобы вы могли использовать сеанс). Будьте внимательны, пользователь может чистить свои куки и публиковать их как «нового» пользователя.
Надеюсь, это поможет.