python - 数据库和 Web 显示界面中错误处理的最佳策略

标签 python database database-design pyramid

在来回尝试放置错误处理例程以优化数据完整性数百次之后,我决定问这个问题,同时还考虑了速度和效率(并在此过程中浪费了数百个小时。所以这是设置。

Database  ->  python classes  ->   python code     ->   javascript
 MongoDB  |   that represent  |   that serves      |  web interface
                the data         pages (pyramid)      

我希望数据稳健,这是首要要求。所以现在我在页面的 javascript 端验证数据,同时也在 python 类中验证数据,这些类或多或少代表了数据结构。虽然大多数服务器例程通过 python 类运行,但有时感觉效率低下,因为它必须通过不同级别的错误检查。

编辑:我想我应该澄清一下。我不希望统一客户端和服务器端代码的验证。抱歉写得不好。我正在更多地寻找应该在哪里进行服务器端验证。应该是在数据库的直接接口(interface)中,还是在接收数据的 Web 服务器代码中。

例如,如果我有一个带有条形码的对象,我应该在通过 AJAX 检查数据的代码中验证条形码,还是应该调用该对象的 class 并在那里进行验证?

同样,是否有关于如何进行一般错误检查的指南?我想成为专业人士,并学习,但希望不必读完整本书。

我不是软件工程师,但我希望那些熟悉复杂项目的人可以告诉我在哪里可以找到一些关于如何在这种情况下建模/错误检查的指南。

我不一定是在寻找答案,而更像是在创建像这样的具有不同层的项目时向我指出一组简短的指南。希望不会太长..

我什至不知道在帖子中使用什么标签。帮助!!

最佳答案

在客户端上验证和在服务器上验证完全有不同的目的。在服务器上进行验证是为了确保模型不变量成立,并且必须这样做才能保持数据完整性。在客户端上进行验证是为了让用户收到一条友好的错误消息,告诉他他的输入将验证数据完整性,而不是让回溯出现在他面前。

因此,有一个微妙的区别,即在服务器上进行验证时,您只关心数据是否有效。是否。在客户端上,您还关心,在更细粒度的级别上,为什么输入可能无效。 (客户端必须处理的另一件事是输入格式错误,即在需要数字的地方输入字符。)

中间有可能会合一点。如果您的模型有效性约束是以声明方式指定的,您可以使用该元数据来生成一些客户端验证,但它们实际上还不够。一个很好的例子是用户注册。通常,您需要两个密码字段,并且希望两个字段中的输入匹配,但模型将仅包含密码的一个属性。您可能还想检查密码复杂性,但它不一定是域模型不变式。 (也就是说,即使用户的密码较弱,您的应用程序也能正常运行,并且密码复杂性策略可以随着时间的推移而改变,而不会破坏数据完整性。)

客户端验证特有的另一个问题是您经常需要表达验证检查之间的依赖关系。 IE。您有一个必填字段,该字段的数字必须小于 100。您需要验证 a) 该字段具有值; b) 该字段值是一个有效的整数; c) 字段值低于100。如果这些检查中的任何一个失败,您希望避免显示不必要的错误消息,以便按顺序进行进一步检查,以便告诉用户他的具体错误是什么。该模型不需要关心这种区别。 (旁白:这是一些框架惨败的地方 - JSF 或 Spring MVC 或它们中的任何一个首先尝试进行从输入字符串到表单对象属性的数据类型转换,如果失败,它们将无法执行任何进一步的验证。 )

结论,上述内容意味着,如果您关心数据完整性、可用性,则必须至少验证数据两次,因为验证实现不同的目的即使有一些重叠。与模型层验证相比,客户端验证将具有更多的检查和更细粒度的检查。我不会真正尝试统一它们,除非您选择的框架使之变得容易。 (我不知道 Pyramid - Django 将这些问题分开,因为 Form 与您的 Model 是不同的层,两者都可以验证,并且它们是由 ModelForm 加入,让您可以向模型执行的验证添加额外的验证。)

关于python - 数据库和 Web 显示界面中错误处理的最佳策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19084869/

相关文章:

python - 从导航台数据存储聚合数据的最佳方式?

php - 查询使 2 个得分相等的团队

sql-server - 多客户端数据库设计 : is separation by schema a good design?

mysql - 在关系数据库中存储非特定日期(例如 "Fall 1997")

mysql - Forum Schema : should the "Topics" table countain topic_starter_Id? 还是冗余信息?

python - 使用 openpyxl 将日期格式更改为 xlsx 中的文本

python - 将数据框列从对象转换为日期而不是日期时间

python - 如何将我的 Shapely 多边形转换为表示(掩模数组)的 numpy 像素数组? Python

database - 关于托管数据库的建议

在对象销毁之前清理 Java 资源