部署静态文件

也可以看看

有关使用django.contrib.staticfiles的介绍,请参阅Managing static files (e.g. images, JavaScript, CSS)

在生产中提供静态文件

生成静态文件的基本概念很简单:在静态文件更改时运行collectstatic命令,然后将收集的静态文件目录(STATIC_ROOT)移动到静态文件服务器和服务。 根据STATICFILES_STORAGE,可能需要手动将文件移动到新位置,否则Storage类的post_process方法可能会考虑到这一点。

当然,就像所有的部署任务一样,魔鬼在细节上。 每个生产设置都会有所不同,所以您需要调整基本轮廓以适应您的需求。 以下是一些可能有帮助的常见模式。

从同一台服务器提供站点和静态文件

如果您想从已经为您的网站提供服务的服务器上提供静态文件,则该过程可能如下所示:

你可能想要自动化这个过程,特别是如果你有多个Web服务器。 有许多方法可以实现这种自动化,但许多Django开发人员喜欢的一个选择是Fabric

在下面和下面的章节中,我们将展示一些示例fabfiles(即 结构脚本)自动执行这些文件部署选项。 fabfile的语法相当简单,但不会在这里介绍。请参阅Fabric的文档,以获取语法的完整说明。

因此,将静态文件部署到多个Web服务器的fabfile可能如下所示:

from fabric.api import *

# Hosts to deploy onto
env.hosts = ['www1.example.com', 'www2.example.com']

# Where your project code lives on the server
env.project_root = '/home/www/myproject'

def deploy_static():
    with cd(env.project_root):
        run('./manage.py collectstatic -v0 --noinput')

从专用服务器提供静态文件

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

配置这些服务器超出了本文档的范围;检查每个服务器的相应文档的说明。

由于您的静态文件服务器不会运行Django,因此您需要修改部署策略,如下所示:

  • 当您的静态文件更改时,请在本地运行collectstatic
  • 将本地的STATIC_ROOT推送到静态文件服务器,放到要提供服务的目录中。 rsync is a common choice for this step since it only needs to transfer the bits of static files that have changed.

下面是在fabfile中可能的样子:

from fabric.api import *
from fabric.contrib import project

# Where the static files get collected locally. Your STATIC_ROOT setting.
env.local_static_root = '/path/to/static'

# Where the static files should go remotely
env.remote_static_root = '/home/www/static.example.com'

@roles('static')
def deploy_static():
    local('./manage.py collectstatic')
    project.rsync_project(
        remote_dir=env.remote_static_root,
        local_dir=env.local_static_root,
        delete=True,
    )

从云服务或CDN服务静态文件

另一个常见的策略是从Amazon S3和/或CDN(内容交付网络)等云存储提供商处提供静态文件。 这可以让你忽略服务静态文件的问题,通常可以使网页更快加载(特别是在使用CDN时)​​。

在使用这些服务时,基本工作流看起来有点像上面的,除了使用rsync将静态文件传输到服务器之外,您需要将静态文件传输到存储提供程序或CDN。

有许多方法可以做到这一点,但是如果提供者具有API,那么custom file storage backend将使过程非常简单。 如果您已经编写或正在使用第三方自定义存储后端,则可以通过将STATICFILES_STORAGE设置为存储引擎来告诉collectstatic使用它。

例如,如果您已经在myproject.storage.S3Storage中编写了S3存储后端,则可以将它用于:

STATICFILES_STORAGE = 'myproject.storage.S3Storage'

完成之后,您只需运行collectstatic,您的静态文件将通过您的存储包推送到S3。 如果以后需要切换到不同的存储提供者,则可以像更改STATICFILES_STORAGE设置一样简单。

有关如何编写其中一个后端的详细信息,请参阅Writing a custom storage system 有第三方应用程序可用于为许多常见文件存储API提供存储后端。 djangopackages.org上的概述是一个很好的起点。

了解更多

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