参见
想要 django.contrib.staticfiles
的使用指南,请参考 如何管理静态文件(如图片、JavaScript、CSS)。
The basic outline of putting static files into production consists of two
steps: run the collectstatic
command when static files change, then
arrange for the collected static files directory (STATIC_ROOT
) to be
moved to the static file server and served. Depending the staticfiles
STORAGES
alias, files may need to be moved to a new location
manually or the post_process
method of
the Storage
class might take care of that.
像所有的部署任务一样,细节决定成败。每个生成环境的配置可能都有点不同个,所以,需要调整基础配置以满足你的需求。以下是常见模式,可能对你有所帮助。
如果你想在早已提供站点服务器服务器上同时提供静态文件服务,操作步骤类似这样:
collectstatic
,将所有的静态文件拷贝至 STATIC_ROOT
。STATIC_URL
下为 STATIC_ROOT
目录下的文件提供静态文件服务。例如, 这里是如何以 Apache 配合 mod_wsgi 开始。你可能期望将该流程自动化,特别是在你有好几个 web 服务器的时候。
大多数大型 Django 网站使用一个单独的 Web 服务器——即一个不同时运行 Django 的服务器——来提供静态文件。这台服务器通常运行不同类型的网络服务器——速度更快,但功能不全。一些常见的选择是:
如何配置这些服务器超出了本文范围;查阅这些服务器各自的文档获取介绍。
由于静态文件服务器并不运行 Django,你需要将部署策略改成这样:
collectstatic
。STATIC_ROOT
推送到静态文件服务器提供服务的目录。 rsync 是一个常见选项,因为这种配置只会传输文件修改部分的数据流。另一个常见的策略是从云存储供应商,如亚马逊的 S3 和/或 CDN(内容交付网络)中提供静态文件。这可以让你忽略提供静态文件的问题,而且通常可以使网页的加载速度更快(特别是在使用 CDN 时)。
使用这些服务时,基本的工作流程与上面类似,除了要将静态文件传输给存储服务商或 CDN,而不是用 rsync
将静态文件传输给服务器。
There's any number of ways you might do this, but if the provider has an API,
you can use a custom file storage backend
to integrate the CDN with your Django project. If you've written or are using a
3rd party custom storage backend, you can tell collectstatic
to use
it by setting staticfiles
in STORAGES
.
例如,若你已在 myproject.storage.S3Storage
中写了一个 S3 存储后端,可以这么用:
STORAGES = {
# ...
"staticfiles": {"BACKEND": "myproject.storage.S3Storage"}
}
Once that's done, all you have to do is run collectstatic
and your
static files would be pushed through your storage package up to S3. If you
later needed to switch to a different storage provider, you may only have to
change staticfiles
in the STORAGES
setting.
关于如何编写这些后端的细节,参考 如何编写一个自定义的文件存储类。有很多可用的第三方应用提供了针对常见文件存储 API 的存储后端。 djangopackages.org 入门 是个不错的起点。
The STORAGES
setting was added.
想要了解所有配置项,命令,模板标签和 django.contrib.staticfiles
包含的其它零碎的完整细节,参考 staticfiles 参考。
5月 12, 2023