我有一个标准用户注册表单的Django 1.7 beta 1项目。
从概念上讲,如果已经使用了用户名,则表单验证失败是有意义的。但是,表单验证和成功创建的用户模型的保存是单独的步骤,因此存在验证可以通过的竞争条件,但实际的user.save()
可能会失败,并显示IntegrityError
。
我不清楚如果表单验证和user.save()
步骤都包含在同一个transaction.atomic()
块中会发生什么 - 我的假设是postgres在表格不会创建任何锁定读取以检查行是否存在,因此事务根本不会阻止竞争条件。
假设情况如此,处理此问题的最佳方法是什么?以下是我目前正在考虑的选项:
IntegrityError
,手动添加到表单错误列表。这是防弹的,但会在表单定义之外移动一些验证逻辑。IntegrityError
周围的try / except块。这可能会添加重复的代码,但现在表单单独工作,并且在视图中使用表单不会导致竞争条件。