这个 staticfiles 应用程序

django.contrib.staticfiles 将每个应用程序(以及指定的任何其他位置)中的静态文件收集到一个可以在生产中轻松提供服务的位置。

参见

有关静态文件应用程序的介绍和一些使用示例,请参阅 如何管理静态文件(如图像、JavaScript、css) . 有关部署静态文件的指南,请参阅 如何部署静态文件 .

设置

staticfiles settings 有关以下设置的详细信息:

管理命令

django.contrib.staticfiles 显示三个管理命令。

collectstatic

django-admin collectstatic

将静态文件收集到 STATIC_ROOT .

默认情况下,重复文件名的解析方式与模板解析的工作方式类似:将使用在指定位置之一中首先找到的文件。如果你感到困惑, findstatic 命令可以帮助您显示找到的文件。

关于后续 collectstatic 运行(如果) STATIC_ROOT 不为空),仅当文件的修改时间戳大于中文件的时间戳时才会复制文件。 STATIC_ROOT . 因此,如果从中删除应用程序 INSTALLED_APPS ,使用 collectstatic --clear 选项以删除过时的静态文件。

通过使用 enabled finders . 默认值是查找在中定义的所有位置 STATICFILES_DIRS 而在 'static' 由指定的应用程序目录 INSTALLED_APPS 设置。

这个 collectstatic 管理命令调用 post_process() 的方法。 staticfiles 存储后端来自 STORAGES 在每次运行之后,并传递管理命令已找到的路径列表。它还接收所有命令行选项 collectstatic 。这是由 ManifestStaticFilesStorage 默认情况下。

默认情况下,收集的文件从接收权限 FILE_UPLOAD_PERMISSIONS 和收集的目录从接收权限 FILE_UPLOAD_DIRECTORY_PERMISSIONS . 如果要对这些文件和/或目录使用不同的权限,可以将 static files storage classes 并指定 file_permissions_mode 和/或 directory_permissions_mode 分别为参数。例如::

from django.contrib.staticfiles import storage


class MyStaticFilesStorage(storage.StaticFilesStorage):
    def __init__(self, *args, **kwargs):
        kwargs["file_permissions_mode"] = 0o640
        kwargs["directory_permissions_mode"] = 0o760
        super().__init__(*args, **kwargs)

然后将 staticfiles 存储后端位于 STORAGES 设置为 'path.to.MyStaticFilesStorage'

一些常用选项包括:

--noinput, --no-input

不要提示用户输入任何类型的内容。

--ignore PATTERN, -i PATTERN

忽略与此全局样式模式匹配的文件、目录或路径。多次使用可忽略更多。指定路径时,始终使用正斜杠,即使在Windows上也是如此。

--dry-run, -n

除了修改文件系统之外,什么都做。

--clear, -c

在尝试复制或链接原始文件之前,请清除现有文件。

创建到每个文件的符号链接,而不是复制。

--no-post-process

不要打电话给 post_process() 已配置的 staticfiles 存储后端来自 STORAGES

--no-default-ignore

不要忽略常见的私有全局样式模式 'CVS''.*''*~' .

有关选项的完整列表,请通过运行以下命令来参阅命令本身的帮助:

$ python manage.py collectstatic --help
...\> py manage.py collectstatic --help

自定义忽略的图案列表

默认的忽略模式列表, ['CVS', '.*', '*~'] ,可以以比提供 --ignore 每个位置的命令选项 collectstatic 调用。提供自定义 AppConfig 类,重写 ignore_patterns 该类的属性并替换 'django.contrib.staticfiles' 在您的 INSTALLED_APPS 设置:

from django.contrib.staticfiles.apps import StaticFilesConfig


class MyStaticFilesConfig(StaticFilesConfig):
    ignore_patterns = [...]  # your custom ignore list

findstatic

django-admin findstatic staticfile [staticfile ...]

使用启用的查找器搜索一个或多个相对路径。

例如:

$ python manage.py findstatic css/base.css admin/js/core.js
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
  /home/polls.com/core/static/css/base.css
Found 'admin/js/core.js' here:
  /home/polls.com/src/django/contrib/admin/media/js/core.js
...\> py manage.py findstatic css\base.css admin\js\core.js
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
  /home/polls.com/core/static/css/base.css
Found 'admin/js/core.js' here:
  /home/polls.com/src/django/contrib/admin/media/js/core.js
findstatic --first

默认情况下,找到所有匹配的位置。要仅返回每个相对路径的第一个匹配项,请使用 --first 选项:

$ python manage.py findstatic css/base.css --first
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
...\> py manage.py findstatic css\base.css --first
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css

这是一个调试辅助工具;它将精确显示为给定路径收集的静态文件。

通过设置 --verbosity 标记为0,您可以取消额外的输出,只需获取路径名:

$ python manage.py findstatic css/base.css --verbosity 0
/home/special.polls.com/core/static/css/base.css
/home/polls.com/core/static/css/base.css
...\> py manage.py findstatic css\base.css --verbosity 0
/home/special.polls.com/core/static/css/base.css
/home/polls.com/core/static/css/base.css

另一方面,通过设置 --verbosity 标记为2,您可以获取搜索到的所有目录:

$ python manage.py findstatic css/base.css --verbosity 2
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
  /home/polls.com/core/static/css/base.css
Looking in the following locations:
  /home/special.polls.com/core/static
  /home/polls.com/core/static
  /some/other/path/static
...\> py manage.py findstatic css\base.css --verbosity 2
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
  /home/polls.com/core/static/css/base.css
Looking in the following locations:
  /home/special.polls.com/core/static
  /home/polls.com/core/static
  /some/other/path/static

runserver

django-admin runserver [addrport]

超越核心 runserver 命令如果 staticfiles 应用程序是 installed 并添加静态文件的自动服务。文件服务无法运行 MIDDLEWARE .

该命令添加了以下选项:

--nostatic

使用 --nostatic 用于禁用静态文件服务的选项 staticfiles 完全是应用程序。只有当 staticfiles 应用程序在您的项目中 INSTALLED_APPS 设置。

示例用法:

$ django-admin runserver --nostatic
...\> django-admin runserver --nostatic
--insecure

使用 --insecure 强制为静态文件提供 staticfiles 即使应用程序 DEBUG 设置是 False . 通过使用这个,你承认事实上 效率极低 而且可能 不安全的 . 这只是为了地方发展,应该 不用于生产 只有在 staticfiles 应用程序在您的项目中 INSTALLED_APPS 设置。

--insecure 不适用于 ManifestStaticFilesStorage .

示例用法:

$ django-admin runserver --insecure
...\> django-admin runserver --insecure

储藏室

StaticFilesStorage

class storage.StaticFilesStorage

的子类 FileSystemStorage 使用的存储后端 STATIC_ROOT 设置为基本文件系统位置和 STATIC_URL 分别设置为基本URL。

storage.StaticFilesStorage.post_process(paths, **options)

如果此方法是在存储上定义的,则由 collectstatic 管理命令在每次运行后,都会将找到的文件的本地存储和路径作为字典传递,以及命令行选项。它生成三个值的元组: original_path, processed_path, processed . 路径值是字符串和 processed 是一个布尔值,指示值是否经过后处理,或者如果后处理失败则为异常。

这个 ManifestStaticFilesStorage 在后台使用此命令将路径替换为哈希对应的路径,并相应地更新缓存。

ManifestStaticFilesStorage

class storage.ManifestStaticFilesStorage

的子类 StaticFilesStorage 存储后端,通过将文件内容的MD5哈希附加到文件名来存储其处理的文件名。例如,文件 css/styles.css 也将另存为 css/styles.55e7cbb9ba48.css .

此存储的目的是在某些页仍然引用这些文件时继续提供旧文件,例如,因为这些文件是由您或第三方代理服务器缓存的。另外,如果你想申请的话,这很有帮助 far future Expires headers 以加快后续页面访问的加载时间。

存储后端会自动将与其他已保存文件匹配的已保存文件中的路径替换为已缓存副本的路径(使用 post_process() 方法)。用于查找这些路径的正则表达式 (django.contrib.staticfiles.storage.HashedFilesMixin.patterns )封面:

子类 ManifestStaticFilesStorage 并将 support_js_module_import_aggregation 属性为 True ,如果您想使用实验性正则表达式来涵盖以下内容:

例如, 'css/styles.css' 包含此内容的文件:

@import url("../admin/css/base.css");

...将被替换为调用 url() 的方法。 ManifestStaticFilesStorage 存储后端,最终节省了 'css/styles.55e7cbb9ba48.css' 包含以下内容的文件:

@import url("../admin/css/base.27e20196a850.css");

的用法 integrity 具有本地文件的Html属性

在使用可选的 integrity 标记中的属性,如 <script><link> ,它的值应该基于提供文件时的文件来计算,而不是存储在文件系统中。这一点尤其重要,因为根据收集静态文件的方式,它们的校验和可能已更改(例如,在使用 collectstatic )。目前,没有现成的工具可用来实现这一点。

您可以使用自定义 ManifestStaticFilesStorage 子类,用于设置 manifest_storage 争论。例如::

from django.conf import settings
from django.contrib.staticfiles.storage import (
    ManifestStaticFilesStorage,
    StaticFilesStorage,
)


class MyManifestStaticFilesStorage(ManifestStaticFilesStorage):
    def __init__(self, *args, **kwargs):
        manifest_storage = StaticFilesStorage(location=settings.BASE_DIR)
        super().__init__(*args, manifest_storage=manifest_storage, **kwargs)

注释中的引用

ManifestStaticFilesStorage 不忽略已注释掉的语句中的路径。这 may crash on the nonexistent paths 。你应该检查并最终删除评论。

storage.ManifestStaticFilesStorage.manifest_hash

此属性提供一个哈希,只要清单中的文件发生更改,该哈希就会更改。这对于向SPA传达服务器上的资产已更改(由于新部署)非常有用。

storage.ManifestStaticFilesStorage.max_post_process_passes

由于静态文件可能引用需要替换其路径的其他静态文件,因此可能需要多次替换路径,直到文件散列聚合。防止由于散列未聚合而产生无限循环(例如,如果 'foo.css' 参考文献 'bar.css' 哪些参考文献 'foo.css' )在放弃后处理之前,通过的次数最多。在引用数量众多的情况下,可能需要更多的传递。通过子类化增加最大通过次数 ManifestStaticFilesStorage 设置 max_post_process_passes 属性。默认值为5。

启用 ManifestStaticFilesStorage 您必须确保满足以下要求:

  • 这个 staticfiles 存储后端位于 STORAGES 设置被设置为 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

  • 这个 DEBUG 设置设置为 False

  • 通过使用 collectstatic 管理指挥部

由于在运行时创建MD5哈希可能会给网站带来性能负担, staticfiles 将自动将所有已处理文件的哈希名称映射存储在一个名为 staticfiles.json . 当你运行 collectstatic 管理命令。

storage.ManifestStaticFilesStorage.manifest_strict

如果在 staticfiles.json 运行时清单,a ValueError 提高了。通过子类化可以禁用此行为 ManifestStaticFilesStorage 设置 manifest_strict 属性到 False --不存在的路径将保持不变。

由于运行的要求 collectstatic ,在运行测试时通常不应使用此存储 collectstatic 不作为正常测试设置的一部分运行。在测试期间,请确保 staticfiles 存储后端位于 STORAGES 设置设置为其他值,如 'django.contrib.staticfiles.storage.StaticFilesStorage' (默认设置)。

storage.ManifestStaticFilesStorage.file_hash(name, content=None)

创建文件散列名称时使用的方法。需要返回给定文件名和内容的哈希。默认情况下,它根据上面提到的内容块计算MD5哈希。请随意重写此方法以使用您自己的哈希算法。

ManifestFilesMixin

class storage.ManifestFilesMixin

将此mixin与自定义存储一起使用,将文件内容的md5哈希附加到文件名 ManifestStaticFilesStorage 做。

查找模块

staticfiles 发现者有 searched_locations 属性,它是查找器搜索的目录路径列表。示例用法:

from django.contrib.staticfiles import finders

result = finders.find("css/base.css")
searched_locations = finders.searched_locations

其他帮手

外面还有几个帮手 staticfiles 要使用静态文件的应用程序:

静态文件开发视图

静态文件工具主要设计用于帮助将静态文件成功部署到生产中。这通常意味着一个单独的、专用的静态文件服务器,在本地开发时,这会造成很大的开销。因此, staticfiles 应用程序附带 快速脏助手视图 可用于在开发过程中本地服务文件。

views.serve(request, path)

这个视图函数为开发中的静态文件提供服务。

警告

只有当 DEBUGTrue .

那是因为这个视图是 效率极低 而且可能 不安全的 . 这只是为了地方发展,应该 不用于生产 .

备注

要猜测服务文件的内容类型,此视图依赖于 mimetypes 来自Python标准库的模块,该库本身依赖于底层平台的映射文件。如果您发现此视图没有为某些文件返回正确的内容类型,则很可能是平台的映射文件不正确或需要更新。例如,可以通过安装或更新 mailcap 红帽分发的包裹, mime-support 在Debian发行版上,或通过编辑 HKEY_CLASSES_ROOT 在Windows注册表中。

此视图由自动启用 runserver (用) DEBUG 设置设置为 True )要将视图与其他本地开发服务器一起使用,请在主URL配置的末尾添加以下代码段:

from django.conf import settings
from django.contrib.staticfiles import views
from django.urls import re_path

if settings.DEBUG:
    urlpatterns += [
        re_path(r"^static/(?P<path>.*)$", views.serve),
    ]

注意,模式的开始 (r'^static/' )应该是你的 STATIC_URL 设置。

由于这有点挑剔,还有一个助手函数可以为您做到这一点:

urls.staticfiles_urlpatterns()

这将返回为已经定义的模式列表提供静态文件的正确URL模式。像这样使用:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

# ... the rest of your URLconf here ...

urlpatterns += staticfiles_urlpatterns()

这将检查您的 STATIC_URL 设置并连接视图以相应地提供静态文件。别忘了设置 STATICFILES_DIRS 适当设置以允许 django.contrib.staticfiles 除了应用程序目录中的文件之外,还知道在哪里查找文件。

警告

只有当 DEBUGTrue 你的 STATIC_URL 设置既不是空的,也不是完整的URL,例如 http://static.example.com/ .

那是因为这个视图是 效率极低 而且可能 不安全的 . 这只是为了地方发展,应该 不用于生产 .

支持“实时测试”的专用测试用例

class testing.StaticLiveServerTestCase

此UnitTest测试用例子类扩展 django.test.LiveServerTestCase .

与其父级一样,您可以使用它来编写测试,这些测试包括运行测试中的代码,并通过HTTP使用测试工具(例如Selenium、PhantomJS等),因此还需要发布静态资产。

但考虑到它利用了 django.contrib.staticfiles.views.serve() 在上面描述的视图中,它可以在测试执行时透明地覆盖 staticfiles 寻找者。这意味着你不需要运行 collectstatic 在测试设置之前或作为测试设置的一部分。