介绍
Django 是一个优秀的基于 Python 的平台,用于构建现代 Web 应用程序。 它最大的优势之一是它可以帮助开发人员更快地工作。
您已经构建了出色的应用程序并进行了部署。 事情很好,但是现在您正在加载大量数据并且您开始有几个人同时使用它,它并没有您想要的那么快。
这是一个常见的问题。 幸运的是,我们有一些工具可以帮助缓解这些问题。
首先,让我们检查一些更明显的问题:
使用真实数据库
在本地开发过程中,很难击败 SQLite3。 除非您很小心,否则您也可能会在虚拟服务器上使用它。
SQLite3 不能像 MySQL 和 PostgreSQL 这样扩展到多个同时用户,特别是对于执行许多写入操作的操作(如果您使用会话,那么您正在写入数据库)。
如果您使用的是低内存 VPS,例如 512MB 的 droplet,我建议使用 MySQL。 如果您有多余的内存(2GB 或更多),那么我建议您考虑使用 PostgreSQL,因为它是许多 Django 开发人员的首选。
禁用调试模式
在进行本地开发时,调试模式是绝对必要的,但它会减慢生产服务器的速度。 查看虚拟服务器的 settings.py 并检查以确保 DEBUG 设置为 False。 还要确认 TEMPLATE_DEBUG 也设置为 False 或设置为 DEBUG。
使用调试工具栏确定性能问题
在您的本地开发计算机上,而不是您的生产服务器上,打开 Django 调试工具栏 以定位具体问题。
为此,您可以安装 django-debug-toolbar 模块,然后向 MIDDLEWARE_CLASSES 字典添加一个条目,如下所示:
MIDDLEWARE_CLASSES = ( # ... 'debug_toolbar.middleware.DebugToolbarMiddleware', # ... )
您还需要创建一个 INTERNAL_IPS 变量并添加您的 IP 地址。 如果你在本地开发,你的 IP 地址可能是 127.0.0.1,所以你需要在 settings.py 中添加这样的一行:
INTERNAL_IPS = ('127.0.0.1',)
最后,添加 debug_toolbar 作为 INSTALLED_APPS 中的最后一项,如下所示:
INSTALLED_APPS = ( # ... 'debug_toolbar', )
安装文档 包含一些您可能需要考虑的更详细信息和可选配置选项。
请记住,不要将这些更改推送到生产环境中! (如果你是故意这样做的,那很好)。
现在,当您浏览网站时,您应该会在网页的一侧看到一个黑色面板。 如果您喜欢统计数据和数字以及各种令人讨厌的细节,您会喜欢的。 您还将很快明白为什么您不希望在生产服务器上使用它!
[[“Signals”|[[File:“%3Ca]]]] https://assets.digitalocean.com/articles/scale_django/img1.png ”>
在构建了许多 Django 应用程序之后,我建议您缩小面板的 SQL 部分,因为这通常是一个值得关注的领域。
Django 的一个好处/问题是在执行查询时 延迟加载 相关字段。 这意味着 Django 宁愿不进行连接。 如果您最终需要相关字段,则每次需要相关字段时都会执行额外的查询。
如果确实需要相关字段,这可能会导致 n+1 个 SQL 查询。 例如,假设您要制作 Twitter 的替代版本。 您为推文创建一个模型,每个模型都与用户模型相关。 在您的主页上,您列出了 30 条最新推文以及创建它们的用户的姓名。 这可能会导致您至少执行 31 个 SQL 查询。 一个查询用于获取推文列表,一个查询用于每个用户名查找。
这个问题的解决方案是select_related。 这是对导致 Django 在获取数据时进行连接的查询的非常简单的修改。 您应该在您知道需要相关字段的任何查找中使用它。
您只需像这样修改查询:
Entry.objects.get(id=5)
看起来像这样:
Entry.objects.select_related().get(id=5)
阅读此功能的文档并仅在必要时使用它。
包起来
以我的经验,上述问题解决了许多站点的初始性能问题,并且都非常容易通过最少的代码和配置更改来解决。