在视图中,我定义了一个函数,该函数在用户在线提交表单时执行。提交表单后,我将执行一些数据库事务,然后基于数据库API中的现有数据触发:
triggerapi():
execute API to send Email to the user and the administrator about
the submitted form
def databasetransactions():
check the data in the submitted form with the data in DB
if the last data submitted by the user is before 10 mins or more:
triggerapi()
def formsubmitted(request):
save the user input in variables
Databasetransactions()
save the data from the submitted form in the DB
在上述情况下,用户在不到5毫秒的持续时间内单击了两次提交按钮。因此,开始处理2个并行数据,并且都触发了电子邮件,这不是您期望的行为。
有办法避免这种情况吗?这样,对于用户会话,应用程序应仅在所有较旧的数据处理完成后才接受数据?
答案 0 :(得分:0)
由于我们使用的是伪代码,因此一种方法可能是对triggerapi()
使用singleton pattern并在已经被证明的情况下返回Not Allowed。
答案 1 :(得分:0)
有多种方法可以解决此问题。
其中之一是创建一个新的会话变量
request.session['activetransaction'] = True
但是,这将要求您传递请求,除非该请求已传递并且我们获得了更改的代码部分。您还可以通过相同的方式为其添加实例/类标志并进行检查。
另一种方法,如果您需要在上一个提交之后处理那些提交,这可能会起作用,您始终可以添加while request.session['activetransaction']:
并随后进行处理。
def formsubmitted(request):
if 'activetransaction' not in request.session or not request.session['activetransaction']:
request.session['activetransaction'] = True
# save the user input in variables
Databasetransactions()
# save the data from the submitted form in the DB
request.session['activetransaction'] = False
...