多个 ajax 请求(单例模式)
Multiple ajax request (Singleton Pattern)
我正在使用 django restless 处理 ajax POST 请求,这花费了将近 10 到 20 秒。
这是我的代码。
class testEndPoint(Endpoint):
def post(self, request):
testForm = TestEmailForm(request.data)
if testForm.is_valid():
sometable = EmailTable.object.get(**condition)
if sometable.is_email_sent == false:
#Send Email
#Took around 15 seconds
sometable.is_email_sent = true
sometable.save()
else:
result = testForm.errors
return serialize(result)
我通过 $.ajax
调用它,但问题是如果两个请求以毫秒时间差命中此 url,则两个请求都通过 if sometable.is_email_sent = false:
条件。
如何防止多次提交。现在我已经在电子邮件发送部分之前移动了 sometable.is_email_sent = true;sometable.save();
,但我需要更通用的解决方案,因为还有十几个地方会发生这种情况。我在 Django 1.5
您应该在开始 ajax 调用之前禁用原始输入元素(这将防止大多数此类问题)。
剩下的问题可以用select_for_update
解决
class testEndPoint(Endpoint):
@transaction.commit_manually
def post(self, request):
testForm = TestEmailForm(request.data)
if testForm.is_valid():
condition['is_email_sent'] = False
try:
rows = EmailTable.objects.select_for_update().filter(**condition)
for row in rows:
row.is_email_sent = True
row.save()
#Send Email
except:
transaction.rollback()
raise
else:
transaction.commit()
else:
result = testForm.errors
return serialize(result)
select_for_update
将锁定行直到事务结束(即它需要在事务内)。通过将 is_email_sent=False
添加到 condition
,我们可以删除 if。我已经将 is_email_sent
的更改移动到 "Send Email" 之上,但这并不是绝对必要的——无论如何,如果出现异常,它会被事务回滚撤销。
我正在使用 django restless 处理 ajax POST 请求,这花费了将近 10 到 20 秒。
这是我的代码。
class testEndPoint(Endpoint):
def post(self, request):
testForm = TestEmailForm(request.data)
if testForm.is_valid():
sometable = EmailTable.object.get(**condition)
if sometable.is_email_sent == false:
#Send Email
#Took around 15 seconds
sometable.is_email_sent = true
sometable.save()
else:
result = testForm.errors
return serialize(result)
我通过 $.ajax
调用它,但问题是如果两个请求以毫秒时间差命中此 url,则两个请求都通过 if sometable.is_email_sent = false:
条件。
如何防止多次提交。现在我已经在电子邮件发送部分之前移动了 sometable.is_email_sent = true;sometable.save();
,但我需要更通用的解决方案,因为还有十几个地方会发生这种情况。我在 Django 1.5
您应该在开始 ajax 调用之前禁用原始输入元素(这将防止大多数此类问题)。
剩下的问题可以用select_for_update
解决class testEndPoint(Endpoint):
@transaction.commit_manually
def post(self, request):
testForm = TestEmailForm(request.data)
if testForm.is_valid():
condition['is_email_sent'] = False
try:
rows = EmailTable.objects.select_for_update().filter(**condition)
for row in rows:
row.is_email_sent = True
row.save()
#Send Email
except:
transaction.rollback()
raise
else:
transaction.commit()
else:
result = testForm.errors
return serialize(result)
select_for_update
将锁定行直到事务结束(即它需要在事务内)。通过将 is_email_sent=False
添加到 condition
,我们可以删除 if。我已经将 is_email_sent
的更改移动到 "Send Email" 之上,但这并不是绝对必要的——无论如何,如果出现异常,它会被事务回滚撤销。