如何部署静态文件

在生产环境中提供静态文件

将静态文件投入生产的基本步骤包括两个步骤:在静态文件更改时运行 collectstatic 命令,然后安排将收集的静态文件目录 (STATIC_ROOT) 移至静态文件服务器并提供服务。根据 staticfiles STORAGES 别名,可能需要手动将文件移至新位置,或者 Storage 类的 post_process 方法可以处理此问题。

与所有部署任务一样,关键在于细节。每个生产环境设置都会略有不同,因此你需要根据自己的需要调整基本大纲。以下是可能有所帮助的一些常见模式。

在同一服务器上提供站点和静态文件

如果你想在已用于提供站点的同一服务器上提供静态文件,则该过程可能如下所示

你可能需要自动化此过程,特别是如果你有多个 Web 服务器。

在专用服务器上提供静态文件

大多数较大的 Django 站点使用单独的 Web 服务器(即,不运行 Django 的服务器)来提供静态文件。此服务器通常运行不同类型的 Web 服务器——速度更快,但功能更少。一些常见选择包括

配置这些服务器不在本文档的讨论范围内;请查看每台服务器各自的文档以获取说明。

由于你的静态文件服务器不会运行 Django,因此你需要修改部署策略,使其类似于

  • 当你的静态文件发生更改时,在本地运行 collectstatic
  • 将你的本地 STATIC_ROOT 推送到静态文件服务器,进入正在提供的目录。 rsync 是此步骤的常见选择,因为它只需要传输已更改的静态文件位。

在云服务或 CDN 上提供静态文件

另一种常见策略是从云存储提供商(如 Amazon 的 S3)和/或 CDN(内容分发网络)提供静态文件。这使你可以忽略提供静态文件的问题,并且通常可以加快网页加载速度(尤其是在使用 CDN 时)。

使用这些服务时,基本工作流将与上述类似,不同之处在于,你无需使用 rsync 将静态文件传输到服务器,而是需要将静态文件传输到存储提供商或 CDN。

你可以用多种方法来实现此目的,但如果提供商有 API,你可以使用自定义文件存储后端将 CDN 与你的 Django 项目集成。如果你编写或正在使用第三方自定义存储后端,你可以通过在STORAGES中设置staticfiles来告诉collectstatic使用它。

例如,如果你在myproject.storage.S3Storage中编写了 S3 存储后端,你可以使用它

STORAGES = {
    # ...
    "staticfiles": {"BACKEND": "myproject.storage.S3Storage"}
}

完成后,你只需运行collectstatic,你的静态文件就会通过你的存储包推送到 S3。如果你以后需要切换到不同的存储提供商,你可能只需要在STORAGES设置中更改staticfiles

有关如何编写其中一个后端的信息,请参阅如何编写自定义存储类。有第三方应用可为许多常见的文件存储 API 提供存储后端。一个好的起点是djangopackages.org 上的概述

在 Django 4.2 中更改

添加了STORAGES设置。

了解更多

有关django.contrib.staticfiles中包含的所有设置、命令、模板标记和其他部分的完整详细信息,请参阅staticfiles 参考

返回顶部