Django开发者常犯的7种错误

2020-03-29 08:51:26  阅读:1  来源:

Django是一个强大的web框架,但是它的强大也带来了责任。在本文中,我们将讨论即使是经验丰富的Django开发人员也会犯的常见错误,但是大多数成功的Django项目迟早都需要处理这些错误。

重新发明轮子

Django有很多现成的特性,甚至还有更多的第三方包。试着在写代码之前“google”一下您想解决的问题——可能已经有一个功能丰富的解决方案了。

您还可以使用在线目录“Django项目”,其中“apps”类别中(用于构建项目的小组件)有超过3200个项目。以下是来自清单前两页的有趣包的简短示例:

  • Haystack:用于Django的模块搜索

  • Django-taggit:用于Django的简单标记

  • Django-guardian:用于Django的每个对象的权限

  • Django-activity-stream:从站点上的操作生成通用的活动流。用户可以跟踪任何参与者的个性化流的活动。

额外提示:我强烈推荐使用cookiecutter-django启动一个新的Django项目。它有一个自定义的用户模型,通过django-allauth进行注册,通过Anymail发送电子邮件,以及许多与安全和部署相关的默认设置。

庞大的应用程序结构

Django是一个松散耦合的框架,它不要求您以任何特定的方式来构建web应用程序。然而,经验丰富的Django开发人员有一种标准的做事方式。

Django web应用程序的基本单元是由一个或多个app组成的Django项目。Django app是一个自包含的包,它应该只做一件事。例如一个博客、会员app或事件日历。

Django app可以包含Python模块、特定于Django的模块(视图、URL、模型、表单等)、静态文件、数据库迁移、管理命令、单元测试等等。您应该使用简单的逻辑将您的项目划分为小型的、可重用的应用程序。

使用这样的结构,相关的功能将更紧密地结合在一起,从而允许您和您的团队更清楚地看到您的应用程序的全貌。最重要的是,您可以将该应用程序导出到另一个项目中并再次使用它,甚至可以将它作为一个开源模块发布在PyPi上。

编写健壮的视图和骨感的模型

Django的体系结构可以描述为一个模型-模板-视图(MTV)或模型-视图-模板(MVT)。

模型是大多数业务逻辑存在的地方。它被定义在models.py中,并存在于应用程序目录中。它还包括将结果传递给视图和模板层的数据库查询。

视图由处理用户交互的代码组成,如处理用户提交的表单和修改数据库中的结果以适应您的模板。它被定义在views.py中。

如果您没有在模型中编写应用程序的逻辑并使用视图,这意味着您在基于视图的模型中编写了代码。这使得视图“健壮”,而模型“骨感”。模型应该健壮一些,而视图应该骨感一些。

您还应该利用自定义管理器。例如,自定义管理器可以提供with_counts方法,该方法会返回一个所有OpinionPoll对象的列表,每个对象都有一个额外的num_responses属性,该属性是聚合查询的结果。有关更多信息,请查看内置的UserManager。

每个视图有太多的查询或未优化的查询

人们经常指责Django的ORM执行了太多的查询或未优化的查询。但是我们在其他框架的ORM中也能看到这种情况。

真正的问题是我们常常没有意识到性能问题及其根源。一旦您发现了瓶颈所在,您就可以选择正确的方法来解决它们。从这里你可以做很多事情,但最有可能的是:

  • 修复普通中断的ORM查询(比如,预取)

  • 调整和优化ORM查询

  • 在正确的位置添加缓存

  • 提供更多的资源

django-debug-toolbar是一个非常棒的调试工具。您可以使用它来跟踪SQL查询、请求、模板、缓存等等中的性能问题。这个小工具包将帮助您快速识别问题。我强烈推荐您使用它。

冗余的模型字段

由于查询不能使用计算列,而且添加一个实际的列只需“进行迁移”,因此,开发人员通常会以不同的方式复制表示相同数据的字段。

>>> 今日签到口令:1bof <<<

很快,您的半数车辆都有is_motorcycle == True和wheel_count == 4字段,并且您不确定应该信任哪个字段(提示:两者都不是)。

使用Django,您可以像这样使用@property装饰器来重构不一致的属性。然而,虽然ORM允许您以属性的形式去访问列,但反之则不正确,因此您必须手动重构每个查询。

没有在模型上添加索引

即使是经验丰富的Django开发人员也会忘记索引。请务必向您的模型添加索引!另一方面,不要对所有东西都进行索引,因为这会减慢插入、更新和删除的速度。一般来说,您希望用于筛选或查询的任何内容都有一个索引。分析您的查询集以确定哪里需要索引。

不一致的数据验证

Django模型可以与一个或多个用于创建和更新模型实例的“表单”相关联。表单有很多默认行为,特别是验证,这是由模型的属性控制的。实际上,模型的许多属性的存在只是为了控制表单的默认行为。

许多Django开发人员忘记了模型不仅仅可以通过它的表单进行修改。他们也忘记了跟踪约束在哪里。非空吗?那是模型上的。在一个字段上定义选项,显式枚举它可以具有什么值?那是在表单上。唯一性吗?在模型上。等等。

这种不一致的验证会导致糟糕的用户体验:预先填充了一个对象的现有数据的表单,会由于现有数据无效而无法提交。

总结

Django旨在帮助开发人员尽可能快地构建软件。然而,在匆忙添加新功能时,很容易会忘记一些东西或放松对全局的考虑。在本文中,我们讨论了Django开发人员经常犯的一些常见错误以及避免这些错误的方法。

即使您是一名熟练的Django开发人员,这个清单也应该会很有用,因为像没有在模型上添加索引或不一致的数据验证之类的错误,不仅仅限于新开发人员。

如果您喜欢这篇文章,那么您应该看看《Django作为Python开发人员web框架的优点和缺点》一文。

英文原文:https://www.softkraft.co/7-common-mistakes-that-django-developers-make/
译者:忧郁的红秋裤