如何部署静态文件Link to this heading

在生产环境提供静态文件服务Link to this heading

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

像所有的部署任务一样,细节决定成败。每个生成环境的配置可能都有点不同个,所以,需要调整基础配置以满足你的需求。以下是常见模式,可能对你有所帮助。

Having your Django application serve static filesLink to this heading

While web servers are much better and faster at serving static files, it is possible to have Django serve them using community-maintained packages. There are static file packages highlighted on the Community Ecosystem page. The Django Packages Static Builders grid has even more options for you!

在同一服务器提供站点和静态文件服务Link to this heading

如果你想在早已提供站点服务器服务器上同时提供静态文件服务,操作步骤类似这样:

你可能期望将该流程自动化,特别是在你有好几个 web 服务器的时候。

专用服务器提供静态文件服务Link to this heading

大多数大型 Django 网站使用一个单独的 Web 服务器——即一个不同时运行 Django 的服务器——来提供静态文件。这台服务器通常运行不同类型的网络服务器——速度更快,但功能不全。一些常见的选择是:

如何配置这些服务器超出了本文范围;查阅这些服务器各自的文档获取介绍。

由于静态文件服务器并不运行 Django,你需要将部署策略改成这样:

  • 当静态文件改变时,本地运行 collectstatic。

  • 将本地 STATIC_ROOT 推送到静态文件服务器提供服务的目录。 rsync 是一个常见选项,因为这种配置只会传输文件修改部分的数据流。

从云服务或 CDN 提供静态文件服务Link to this heading

另一个常见的策略是从云存储供应商,如亚马逊的 S3 和/或 CDN(内容交付网络)中提供静态文件。这可以让你忽略提供静态文件的问题,而且通常可以使网页的加载速度更快(特别是在使用 CDN 时)。

使用这些服务时,基本的工作流程与上面类似,除了要将静态文件传输给存储服务商或 CDN,而不是用 rsync 将静态文件传输给服务器。

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

例如,若你已在 myproject.storage.S3Storage 中写了一个 S3 存储后端,可以这么用:

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

一旦完成了这些步骤,你只需运行 collectstatic,你的静态文件将通过存储包上传到 S3。如果以后需要切换到不同的存储提供商,你可能只需更改 STORAGES 设置中的 staticfiles。

关于如何编写这些后端的细节,参考 如何编写一个自定义的文件存储类。有很多可用的第三方应用提供了针对常见文件存储 API 的存储后端。 djangopackages.org 入门 是个不错的起点。

了解更多Link to this heading

想要了解所有配置项,命令,模板标签和 django.contrib.staticfiles 包含的其它零碎的完整细节,参考 staticfiles 参考。