多个 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

django restless

您应该在开始 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" 之上,但这并不是绝对必要的——无论如何,如果出现异常,它会被事务回滚撤销。