Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 防止多个请求可能同时触发只应运行一次的调用的争用情况_Python_Django_Django Models_Django 1.4 - Fatal编程技术网

Python 防止多个请求可能同时触发只应运行一次的调用的争用情况

Python 防止多个请求可能同时触发只应运行一次的调用的争用情况,python,django,django-models,django-1.4,Python,Django,Django Models,Django 1.4,因此,这不一定是Django的问题,我只是有一个思维障碍让我的头脑绕过逻辑,但我想Django可能会提供一些手动锁定记录的方法,这会很有帮助 基本上,用户一次可以上载一个或多个文件。每个文件都通过单独的请求上传。当用户超过90%的存储配额时,我想向他们发送一封电子邮件通知他们,但我只想发送一封电子邮件。因此,我当前的工作流程是检查它们的使用情况,确保它们尚未发送提醒,以及: if usage_pct >= settings.VDISK_HIGH_USAGE_THRESHOLD and di

因此,这不一定是Django的问题,我只是有一个思维障碍让我的头脑绕过逻辑,但我想Django可能会提供一些手动锁定记录的方法,这会很有帮助

基本上,用户一次可以上载一个或多个文件。每个文件都通过单独的请求上传。当用户超过90%的存储配额时,我想向他们发送一封电子邮件通知他们,但我只想发送一封电子邮件。因此,我当前的工作流程是检查它们的使用情况,确保它们尚未发送提醒,以及:

if usage_pct >= settings.VDISK_HIGH_USAGE_THRESHOLD and disk.last_high_usage_reminder is None:
    disk.last_high_usage_reminder = timezone.now()
    disk.save()
    vdisks_high_usage_send_notice(user)

但是,上面的代码通常允许多封电子邮件通过。因此,我的第一个想法是在检查值之前以某种方式锁定磁盘记录,然后在保存后解锁它。这是可能的和/或可取的,还是有更好的方法?

好的,我相信我已经用这个答案解决了这个问题:

首先,实现这个实用功能:

@transaction.commit_manually
def flush_transaction():
    transaction.commit()
然后修改我的原始代码以刷新并重新加载磁盘记录:

flush_transaction()
disk = user.profile.diskstorage
if usage_pct >= settings.VDISK_HIGH_USAGE_THRESHOLD and disk.last_high_usage_reminder is None:
    disk.last_high_usage_reminder = timezone.now()
    disk.save()
    vdisks_high_usage_send_notice(user)