Django开发人员常犯的7个错误

Django是强大的Web框架,但越强大责任也大。 在本文中,我们将介绍即使经验丰富的Django开发人员也会犯的常见错误,但是大多数成功的Django项目或早或晚都需要处理这些错误。

重新发明轮子
Django具有许多现成的功能,甚至在第三方软件包中还有更多功能。 在写东西之前,尝试“搜索”您要解决的问题-可能已经存在功能丰富的解决方案。

您也可以使用在线目录Django Projects,其中类别“ apps”(用于构建项目的小型组件)具有3200多个项目。 以下是清单前两页中有趣的程序包的简短示例:

Haystack模块化搜索Django
Django的Django-taggit简单标记
Django的Django-guardian每个对象权限
Django-activity-stream根据您网站上的操作生成通用活动流。 用户可以关注任何演员活动以进行个性化播放

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

整体应用结构
Django是一个松散耦合的框架,不需要您以任何特定方式构建Web应用程序。 但是,经验丰富的Django开发人员具有标准的处理方式。

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

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

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

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

视图由处理用户交互的代码组成,这些代码包括用户提交的表单以及根据数据库调整结果以适合您的模板。它在views.py中定义。

如果您没有在模型中编写应用程序逻辑并使用视图,则意味着您已在基于视图的模型中编写了代码。这使视图“fat”,使模型“skinny”。模型应该fat,视图应该skinny。

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

每个视图的查询过多,或未优化的查询
Django的ORM通常会因进行过多查询或未优化查询而受到指责。 但是我们看到其他框架中的ORM也会发生这种情况。

真正的问题是我们常常不了解性能问题及其根源。 找出瓶颈所在后,您便可以选择正确的方法来解决它们。 您可以在这里做很多事情,但是最有可能的是:

修复断掉的ORM查询(预取)
调整和优化ORM查询
在正确的位置添加缓存
提供更多资源
django-debug-toolbar是一个了不起的调试工具。 您可以使用它来跟踪SQL查询,请求,模板,缓存等中的性能问题。此小程序包将帮助您快速识别问题。 我强烈建议使用它。

冗余模型字段
由于查询不能使用计算列,而添加真实列仅是“迁移”,因此开发人员通常会复制以不同方式表示相同数据的字段。

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

使用Django,您可以使用@property装饰器来重构不一致的属性。但是,尽管ORM允许您将列作为属性访问,但事实并非如此,因此您必须手动重构每个查询。

不在模型上添加索引
即使是经验丰富的Django开发人员也忘记了索引。请为模型添加索引!另一方面,不要索引所有内容,因为它会减慢插入,更新和删除的速度。通常,您希望在将用于过滤或联接的任何内容上建立索引。分析您的QuerySet以确定需要索引的位置。

数据验证不一致
Django模型可以与一个或多个用于创建和更新模型实例的“表单”相关联。表单具有许多默认行为,尤其是验证,该行为由模型的属性控制。实际上,模型的许多属性仅存在于控制表单的默认行为。

许多Django开发人员忘记了模型不仅可以通过其形式进行修改。他们还忘记跟踪哪些约束在哪里。非空?在模型上。在字段上定义选择,显式枚举字段可以具有的值?在表格上。独特性?在模型上。等等。

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

写在最后
Django旨在帮助尽快构建软件。 但是,在急于添加新功能时,很容易忘记某些东西或使全局失去吸引力。 在本文中,我们将介绍Django开发人员经常犯的一些常见错误以及避免这些错误的方法。

即使您是熟练的Django开发人员,此清单也应该很有用,因为错误(例如不在模型上添加索引或不一致的数据验证)不仅限于新开发人员。

如果您喜欢本文,则应查看Django的优缺点作为Python开发人员的Web框架。