django - 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">
解决方案
您可能正在寻找的东西称为幂等性,它可以通过生成一个密钥来解决,该密钥将成为 POST 请求和创建的数据库对象的一部分,并且必须是唯一的。
好的,这个方法并没有解决多个 POST 请求的问题,但至少是在数据库中创建多个条目的关键操作。
推荐阅读
- ios - 模块 XXX 未使用 Library Evolution 支持构建
- javascript - 在javascript中登录Firebase Auth时如何将用户重定向到另一个页面?
- azure-storage - 删除保管库密钥后无法更改加密中的任何内容
- javascript - 带有 $scope.Array 和 HTML DIV 的占位符文本
- python - GEKKO'对象没有属性'最大化'
- html - CSS/HTML 页面上的重定向链接导致 404 未找到
- javascript - Angular 9 中使用构造函数参数生成动态组件
- python - 在 python 类中定义事件回调
- visual-studio-code - 如何增加缩进中的空格大小?
- java - 如何在模块中导入包(maven)