我有一个基于django的网站,其中包含用户身份验证系统。有一个模型(比如A),其属性文件名必须是唯一的。单击网页上的某个按钮时,其中一个python视图执行以下操作
file=randomNameX()
a=A(filename=file)
a.save()
def randomStringX(length):
s = ''
letters = "0123456789abcdefghijklmnopqrstuvwxyz"
while len(s) < length:
s += letters[random.randint(0, len(letters)-1)]
return s
def randomNameX():
name = randomString(10)
while A.objects.filter(filename="_"+name).count() > 0:
name = randomString(10)
return name
两个用户(用户1和用户2)是否可能同时生成相同的文件名,并且数据库条目首先发生在用户1上,并且由于该属性是唯一的,因此用户2会引发异常? / p>
如果是,请告诉我如何克服这个问题。
答案 0 :(得分:0)
您描述的内容称为竞争条件(http://en.wikipedia.org/wiki/Race_condition)。
当前代码是否会发生这种情况取决于“生成随机文件名”的实现,所以只能告诉答案,但避免这种问题的最简单方法是使用一些UUID系统({{ 3}}),无论是标准的还是“自己动手”的解决方案。
鉴于上下文(HTTP请求处理程序),时间戳,请求客户端的IP地址和一些随机内容的组合应足以大大降低此类冲突的可能性。