【问题标题】:prevent a form to be submitted multiple times - django防止表单多次提交 - django
【发布时间】:2014-06-13 03:51:00
【问题描述】:

我正在提交一个表单。之后我在做HttpResponseRedirect,这样如果我刷新页面就不会提交表单。但是,如果我在浏览器中go back 并再次提交表单,表单将被保存多次。我怎样才能防止这种情况?

我想到了会话,意思是我设置了一个这样的会话名称:

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

但这会导致用户在他的实际会话中永远无法在我的页面中发送另一个表单。

如何为每个表单创建唯一的会话,这样一个表单不会被多次提交,但仍然可以提交另一个表单?

【问题讨论】:

  • 您可以在页面上添加一个过期标题到过去的时间(-1)并且使用返回按钮时页面将无效。使用会话 cookie 来存储它也可以。
  • @PatrickBassut 我没有刷新问题,我有返回按钮的问题。不过还是谢谢
  • 您希望用户不要两次提交相同的数据,还是不要在给定的短时间内提交相同的数据?
  • @PatrickBassut 不要再次提交相同的表格 - 无论是在短时间内还是提交多少次......

标签: django session session-cookies


【解决方案1】:

一种方法是对表单的字段进行哈希处理,当服务器收到请求时,您检查表单的哈希是否已经存在(例如,表单已经提交)。像这样的:

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

其中 hashed_form 是连接的表单数据或您喜欢的任何方式

因此,永远不会提交两个被视为相等的表单

【讨论】:

  • @doniyor 怎么样?
  • 如果表单来自客户端,我如何散列值并设置为某个字段?
  • 我不明白。只要用户完成会话,会话变量就会一直存在。并且表单不应该直接与哈希有任何关系。哈希是我们用来检查表单是否重复的服务器端的事情。就是这样。
  • 我想,我想错了。你是对的,会话是解决这个问题的最好方法。
  • 是的。有点不同的代码,但和你的一样。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多