在Django中设置超时函数
我正在创建一个Django应用,允许用户向现有的文本行组中添加新的一行文本。不过,我不希望多个用户同时向同一组文本行添加内容。因此,我创建了一个布尔字段isBeingEdited,当用户决定要编辑某个特定组时,这个字段会被设置为True。一旦这个字段为True,其他人就不能再向这个组添加内容,直到编辑提交完成,这时这个字段会被重新设置为False。这种方法基本上是可行的,但如果有人决定编辑后又改变主意或者忘记了,就会出现问题。我想让isBeingEdited在大约10分钟后自动变回False。这是需要用cron来处理吗,还是有更简单的方法?有什么建议吗?
1 个回答
4
把布尔值改成一个“锁定时间”
- 要锁定模型,把锁定时间设置为当前时间。
- 要解锁模型,把锁定时间设置为None(也就是没有值)。
- 添加一个“is_locked”方法。这个方法会检查当前时间,如果当前时间比锁定时间晚了10分钟,就返回“没有锁定”。
这样你就能实现超时功能,不需要使用Cron(定时任务)或者频繁查询数据库来检查状态。只有在你想知道这个模型是否被锁定的时候,才会检查时间。而使用Cron的话,可能需要检查所有模型。
from django.db import models
from datetime import datetime, timedelta
# Create your models here.
class yourTextLineGroup(models.Model):
# fields go here
lock_time = models.DateTimeField(null=True)
locked_by = models.ForeignKey()#Point me to your user model
def lock(self):
if self.is_locked(): #and code here to see if current user is not locked_by user
#exception / bad return value here
pass
self.lock_time = datetime.now()
def unlock(self):
self.lock_time = None
def is_locked(self):
return self.lock_time and datetime.now() - self.lock_time < timedelta(minutes=10)
上面的代码假设调用者在调用锁定或解锁后会调用保存方法。