view视图代码:
@login_required
def data(request, page, keyword,strEncode):
current_username = request.user
data_s = dosomething() #花费比较长的时间
if not UserRecord.objects.filter(user=User.objects.get(username=current_username),MyRecords=keyword):
UserRecord.objects.create(user=User.objects.get(username=current_username),MyRecords=keyword)
return JsonResponse(data_s, safe=False)
模型代码:
class UserRecord(models.Model):
user = models.ForeignKey(User)
MyRecords = models.CharField(max_length=128)
def __unicode__(self):
return self.user.username
现在我重复请求(快速,无间隔)5次http://127.0.0.1:8000/1/test/...(类似多线程并发),由于视图里面的dosomething函数会消耗比较长的时间,5个请求会并发进行,由于是并发,数据库中会记录5个test值,本意只想记录一个,怎么解决这个问题?django有没有像线程锁一样的东西,或者临界区类似的?lock.acquire(),lock.release()?
1 回答
![?](http://img1.sycdn.imooc.com/533e4c9c0001975102200220-100-100.jpg)
跃然一笑
TA贡献1826条经验 获得超6个赞
django默认没有提供锁,你可以使用其他服务提供的锁服务,比如数据库的。
不过看你的需求可以有更简单的做法:
设置MyRecords字段为unique
MyRecords = models.CharField(max_length=128, unique=True)-
在create record时catch InterityError异常
from django.db import IntegrityError
try:
UserRecord.objects.create( user=User.objects.get(username=current_username), MyRecords=keyword )
except IntegrityError:
pass
添加回答
举报
0/150
提交
取消