Django是否存在防止重复表单提交的库?

2024-04-26 22:20:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到一种方法来防止用户重复提交我的表单。我有禁用submit按钮的javascript,但是仍然有一个偶然的用户找到了双重提交的方法。

我设想了一个可重用的库,我可以创建这个库来保护它。

在我理想的库中,代码块将如下所示:

try:
    with acquire_lock({'field1':'abc', 'field2':'def'}) as lock:
        response = #do some credit card processing
        lock.response = response
except SubmissionWasDuplicate, e:
    response = e.response

锁表应该是这样的:

duplicate_submission_locks

  • 提交参数的MD5
  • 响应#pickled数据
  • 创建用于清扫此桌子的
  • lock_expired#布尔值表示锁是否已过期

有人知道这是否已经存在吗?写起来似乎并不难,所以如果它不存在,我可以自己写。


Tags: 方法代码用户lock表单responsewithjavascript
3条回答

老实说,您的最佳选择(简单而良好的实践)是向“感谢”页面发出HTTPRedirect(),如果“感谢”页面与表单相同,那就没问题。你还可以这么做。

可以使用会话存储哈希

import hashlib

def contact(request):
    if request.method == 'POST':
        form = MyForm(request.POST)
        #join all the fields in one string
        hashstring=hashlib.sha1(fieldsstring)
        if request.session.get('sesionform')!=hashstring:
            if form.is_valid() :                                         
                request.session['sesionform'] = hashstring
                #do some stuff...
                return HttpResponseRedirect('/thanks/') # Redirect after POST  
        else
           raise SubmissionWasDuplicate("duplicate")
    else:
        form = MyForm() 

使用这种方法(不删除会话cookie),用户不能在会话过期时重新存储数据,顺便说一句,我假设存在一个标识发送数据的用户的东西

解决这个问题的一个简单方法是为每个表单添加一个唯一的散列。然后你可以有一个当前表单的滚动表。提交表单或哈希值太旧时,可以将其从表中过期,并拒绝表中没有匹配哈希值的任何表单。

正如前面提到的,HTTPRedirect是正确的方法。

不幸的是,即使Django自己的内置管理也容易出现与此问题相关的问题。在某些情况下,跨站点脚本框架可以帮助防止其中的某些情况,但我担心当前的生产版本没有内置此功能。

相关问题 更多 >