在Django多边项目中构建数据验证的最佳实践

时间:2016-02-11 11:38:25

标签: python django api rest django-rest-framework

我知道这是一个广泛的问题。 但是,让我们假设您有一个Django项目,其中包含移动应用客户端使用的API。

您可以在很多地方添加验证逻辑:

  • 模型字段本身
  • 模型,通过覆盖save()方法
  • Django表单和模型表单。
  • API序列化程序(通用序列化程序或模型序列化程序)

在构建项目时,有哪些规则/元素可以帮助您选择是否应该在此处进行验证?

1 个答案:

答案 0 :(得分:5)

这是一个意见和风格问题。我认为模型验证是一个绝对的要求,是防止错误的最后一道防线。一旦模型验证到位,您就可以继续使用面向验证的表单,客户端和API。

特定的模型验证,字段或模型方法(或自定义管理器等)是样式的选择,适用于特定应用程序,但保持模型验证。这是一个可以捕捉到它的地方。您可能有许多表单,许多API,但有一点是数据进入数据库。

django的一个优点是,在许多情况下,模型验证会传播,例如: ModelForms。所以这也是一种方便,但这是一件好事:模型验证本质上是数据库的最后一道门,应该得到妥善处理。

旁注:“字段”验证实际上是“数据库验证”和“django字段验证”。

尽可能遵守DRY原则:

  1. 使用通用验证器的django方法。因此,即使您在多个地方进行验证,也可以使用相同的验证。如果此验证发生更改,则会随处更改,请参阅https://docs.djangoproject.com/en/1.9/ref/validators/

  2. 如果可能,所有面向客户的对象都应该提取模型验证并使用它们,或者将它们映射到正确的客户端验证,类似于ModelForms。

  3. 如果可能,请使用模型验证错误消息为客户创建有意义的反馈。

  4. 但是验证可能会重复步骤,主要是因为验证具有(至少)两个角色:清理数据并向用户提供反馈。最好的例子是客户端验证。提供即时反馈非常有用,无需向服务器进行往返,但它会重复进行服务器端验证。模型验证只是确保在添加更多表单,API,选项时,如果您忘记执行正确的验证 - 模型将阻止它。