首页 > 解决方案 > Django - 当用户多次单击提交按钮时防止重复的 POST 请求?

问题描述

如果用户多次单击“发送消息”按钮,什么是防止多个 POST 请求发生的最有效方法。

<!-- message.html -->
    <form action="{% url 'send_message' %}" enctype="multipart/form-data" method="POST">
        {% csrf_token %}
        <input type="text" id="messagename" name="messagename" maxlength="50" required>
        <textarea id="messagecopy" name="messagecopy" required></textarea>
        <input type="submit" class="btn" value="Send Message">
    </form>

还有我的views.py

def send_message(request):
    if request.method == "POST":
            campaign = Campaign()
            campaign.name = request.POST["messagename"]
            campaign_message = request.POST["messagecopy"]
            campaign.messagecopy = campaign_message
            campaign.save()
            send_message(campaign_message)
            redirect('home')

更新 我在我的 html 中添加了以下脚本:

function disable_on_click() {
    var x = document.getElementsByClassName('btn');
    var i;
    for (i = 0; i < x.length; i++) {
      x[i].setAttribute("disabled", "disabled")
    }
    
  }

我更新<input type="submit" class="btn" value="Send Message"><input type="submit" onclick="disable_on_click()" class="btn" value="Send Message">

现在按钮在点击时被禁用,但 POST 请求根本没有通过

更新#2

对我有用的是添加一个 onsubmit<form action="{% url 'send_message' %}" enctype="multipart/form-data" method="POST" onsubmit="myButton.disabled = true; return true;">并将 myButton 添加为按钮的名称<input name="myButton" type="submit" class="btn" value="Send Message">

标签: djangodjango-viewsdjango-templates

解决方案


您可能正在寻找的东西称为幂等性,它可以通过生成一个密钥来解决,该密钥将成为 POST 请求和创建的数据库对象的一部分,并且必须是唯一的。

好的,这个方法并没有解决多个 POST 请求的问题,但至少是在数据库中创建多个条目的关键操作。


推荐阅读