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

Dav*_* D. 7 python api django rest django-rest-framework

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

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

  • 模型领域本身
  • 模型,通过重写save()方法
  • Django表单和模型表单.
  • API序列化程序(通用序列化程序或模型序列化程序)

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

Avi*_*aor 5

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

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

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

旁注:"字段"验证实际上是"数据库验证"和"django字段验证".

尽可能遵守DRY原则:

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

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

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

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