staticfiles
应用程序¶django.contrib.staticfiles
将每个应用程序(以及指定的任何其他位置)中的静态文件收集到一个可以在生产中轻松提供服务的位置。
参见
有关静态文件应用程序的介绍和一些使用示例,请参阅 如何管理静态文件(如图像、JavaScript、css) . 有关部署静态文件的指南,请参阅 如何部署静态文件 .
见 staticfiles settings 有关以下设置的详细信息:
django.contrib.staticfiles
显示三个管理命令。
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'
。
一些常用选项包括:
不要提示用户输入任何类型的内容。
忽略与此全局样式模式匹配的文件、目录或路径。多次使用可忽略更多。指定路径时,始终使用正斜杠,即使在Windows上也是如此。
除了修改文件系统之外,什么都做。
在尝试复制或链接原始文件之前,请清除现有文件。
创建到每个文件的符号链接,而不是复制。
不要打电话给 post_process()
已配置的 staticfiles
存储后端来自 STORAGES
。
不要忽略常见的私有全局样式模式 '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
¶使用启用的查找器搜索一个或多个相对路径。
例如:
$ 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
默认情况下,找到所有匹配的位置。要仅返回每个相对路径的第一个匹配项,请使用 --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
¶超越核心 runserver
命令如果 staticfiles
应用程序是 installed
并添加静态文件的自动服务。文件服务无法运行 MIDDLEWARE
.
该命令添加了以下选项:
使用 --nostatic
用于禁用静态文件服务的选项 staticfiles 完全是应用程序。只有当 staticfiles 应用程序在您的项目中 INSTALLED_APPS
设置。
示例用法:
$ django-admin runserver --nostatic
...\> django-admin runserver --nostatic
使用 --insecure
强制为静态文件提供 staticfiles 即使应用程序 DEBUG
设置是 False
. 通过使用这个,你承认事实上 效率极低 而且可能 不安全的 . 这只是为了地方发展,应该 不用于生产 只有在 staticfiles 应用程序在您的项目中 INSTALLED_APPS
设置。
--insecure
不适用于 ManifestStaticFilesStorage
.
示例用法:
$ django-admin runserver --insecure
...\> django-admin runserver --insecure
StaticFilesStorage
¶的子类 FileSystemStorage
使用的存储后端 STATIC_ROOT
设置为基本文件系统位置和 STATIC_URL
分别设置为基本URL。
如果此方法是在存储上定义的,则由 collectstatic
管理命令在每次运行后,都会将找到的文件的本地存储和路径作为字典传递,以及命令行选项。它生成三个值的元组: original_path, processed_path, processed
. 路径值是字符串和 processed
是一个布尔值,指示值是否经过后处理,或者如果后处理失败则为异常。
这个 ManifestStaticFilesStorage
在后台使用此命令将路径替换为哈希对应的路径,并相应地更新缓存。
ManifestStaticFilesStorage
¶的子类 StaticFilesStorage
存储后端,通过将文件内容的MD5哈希附加到文件名来存储其处理的文件名。例如,文件 css/styles.css
也将另存为 css/styles.55e7cbb9ba48.css
.
此存储的目的是在某些页仍然引用这些文件时继续提供旧文件,例如,因为这些文件是由您或第三方代理服务器缓存的。另外,如果你想申请的话,这很有帮助 far future Expires headers 以加快后续页面访问的加载时间。
存储后端会自动将与其他已保存文件匹配的已保存文件中的路径替换为已缓存副本的路径(使用 post_process()
方法)。用于查找这些路径的正则表达式 (django.contrib.staticfiles.storage.HashedFilesMixin.patterns
)封面:
这个 @import 规则和 url() 的声明 Cascading Style Sheets 。
Source map CSS和JavaScript文件中的注释。
子类 ManifestStaticFilesStorage
并将 support_js_module_import_aggregation
属性为 True
,如果您想使用实验性正则表达式来涵盖以下内容:
这个 modules import 在JavaScript中。
这个 modules aggregation 在JavaScript中。
例如, '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)
此属性提供一个哈希,只要清单中的文件发生更改,该哈希就会更改。这对于向SPA传达服务器上的资产已更改(由于新部署)非常有用。
由于静态文件可能引用需要替换其路径的其他静态文件,因此可能需要多次替换路径,直到文件散列聚合。防止由于散列未聚合而产生无限循环(例如,如果 '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
管理命令。
如果在 staticfiles.json
运行时清单,a ValueError
提高了。通过子类化可以禁用此行为 ManifestStaticFilesStorage
设置 manifest_strict
属性到 False
--不存在的路径将保持不变。
由于运行的要求 collectstatic
,在运行测试时通常不应使用此存储 collectstatic
不作为正常测试设置的一部分运行。在测试期间,请确保 staticfiles
存储后端位于 STORAGES
设置设置为其他值,如 'django.contrib.staticfiles.storage.StaticFilesStorage'
(默认设置)。
创建文件散列名称时使用的方法。需要返回给定文件名和内容的哈希。默认情况下,它根据上面提到的内容块计算MD5哈希。请随意重写此方法以使用您自己的哈希算法。
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
要使用静态文件的应用程序:
这个 django.template.context_processors.static()
添加的上下文处理器 STATIC_URL
到用呈现的每个模板上下文 RequestContext
context。
内置模板标记 static
它采用一条路径,并用静态前缀将其连接起来 STATIC_URL
。如果 django.contrib.staticfiles
,则该标记使用 url()
的方法。 staticfiles
存储后端来自 STORAGES
取而代之的是。
内置模板标记 get_static_prefix
用静态前缀填充模板变量 STATIC_URL
用作变量或直接用作变量。
类似的模板标记 get_media_prefix
工作原理是 get_static_prefix
但使用 MEDIA_URL
.
这个 staticfiles
键入 django.core.files.storage.storages
包含静态文件存储后端的即用型实例。
静态文件工具主要设计用于帮助将静态文件成功部署到生产中。这通常意味着一个单独的、专用的静态文件服务器,在本地开发时,这会造成很大的开销。因此, staticfiles
应用程序附带 快速脏助手视图 可用于在开发过程中本地服务文件。
这个视图函数为开发中的静态文件提供服务。
备注
要猜测服务文件的内容类型,此视图依赖于 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
设置。
由于这有点挑剔,还有一个助手函数可以为您做到这一点:
这将返回为已经定义的模式列表提供静态文件的正确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
除了应用程序目录中的文件之外,还知道在哪里查找文件。
警告
只有当 DEBUG
是 True
你的 STATIC_URL
设置既不是空的,也不是完整的URL,例如 http://static.example.com/
.
那是因为这个视图是 效率极低 而且可能 不安全的 . 这只是为了地方发展,应该 不用于生产 .
此UnitTest测试用例子类扩展 django.test.LiveServerTestCase
.
与其父级一样,您可以使用它来编写测试,这些测试包括运行测试中的代码,并通过HTTP使用测试工具(例如Selenium、PhantomJS等),因此还需要发布静态资产。
但考虑到它利用了 django.contrib.staticfiles.views.serve()
在上面描述的视图中,它可以在测试执行时透明地覆盖 staticfiles
寻找者。这意味着你不需要运行 collectstatic
在测试设置之前或作为测试设置的一部分。
12月 18, 2023
注释中的引用
ManifestStaticFilesStorage
不忽略已注释掉的语句中的路径。这 may crash on the nonexistent paths 。你应该检查并最终删除评论。