staticfiles app

django.contrib.staticfiles 从你的应用(和其他你指定的地方)收集所有静态文件到同一个地方,这样产品就能很容易的被维护

请参见

有关静态文件应用程序和一些使用示例的介绍,请参阅Managing static files (e.g. images, JavaScript, CSS) 如果你想知道如何部署静态文件, 请参阅 Deploying static files.

管理命令

django.contrib.staticfiles 公开三个管理命令

collectstatic

django-admin collectstatic

搜集静态文件到 STATIC_ROOT.

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

在随后的collectstatic运行(如果STATIC_ROOT不为空),只有文件的修改时间戳大于STATIC_ROOT 因此,如果从INSTALLED_APPS中删除应用程序,最好使用collectstatic --clear选项命令删除陈旧的静态文件。

使用enabled finders搜索文件。 默认值是查看由STATICFILES_DIRS中定义的所有位置以及在由INSTALLED_APPS设置指定的应用程序的'static'目录中定义的所有位置。

collectstatic管理命令在每次运行后调用STATICFILES_STORAGEpost_process()方法,并传递管理所发现的路径列表命令。 它还接收collectstatic的所有命令行选项。 默认情况下,它由CachedStaticFilesStorage使用。

默认情况下,收集的文件从FILE_UPLOAD_PERMISSIONS接收权限,收集的目录从FILE_UPLOAD_DIRECTORY_PERMISSIONS接收权限。 如果您希望对这些文件和/或目录使用不同的权限,可以暂存static files storage classes,并指定directory_permissions_mode和/或file_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(MyStaticFilesStorage, self).__init__(*args, **kwargs)

然后将STATICFILES_STORAGE设置为'path.to.MyStaticFilesStorage'

一些常用的选项是:

- noinput T0>, - 无输入 T0> T1> ¶ T2>

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

- 忽视 模式, -一世 模式

忽略与此glob样式模式匹配的文件或目录。 使用多次忽略更多。

- 空转 T0>, -n T0> T1> ¶ T2>

除了修改文件系统之外,执行所有操作。

- 明确 T0>, -c T0> T1> ¶ T2>

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

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

- 无后处理 T0> T1> ¶ T2>

不要调用配置的STATICFILES_STORAGE存储后端的post_process()方法。

- 无 - 缺省 - 忽略 T0> T1> ¶ T2>

不要忽略常用的私有glob样式模式'CVS' ”。*” '*~'

有关选项的完整列表,请参阅命令自己的帮助,运行:

$ python manage.py collectstatic --help

定制忽略的模式列表

Django 1.10 中新增的功能。

默认忽略模式列表, [ 'CVS', ”。*”, '*〜'],可以比在每个collectstatic调用时提供--ignore命令选项更加持久的定制。 Provide a custom AppConfig class, override the ignore_patterns attribute of this class and replace 'django.contrib.staticfiles' with that class path in your INSTALLED_APPS setting:

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
findstatic - 第一

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

$ python 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

另一方面,通过将--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

runserver

django-admin runserver [addrport]

如果staticfiles应用程序installed,则覆盖核心runserver命令,并添加自动提供的静态文件。 文件服务不能通过MIDDLEWARE运行。

该命令添加以下选项:

- nostatic T0> T1> ¶ T2>

使用--nostatic选项可以完全禁止使用staticfiles应用程序提供静态文件。 仅当staticfiles应用位于项目的INSTALLED_APPS设置中时,此选项才可用。

用法示例:

django-admin runserver --nostatic
- 不安全 T0> T1> ¶ T2>

使用False选项强制使用staticfiles应用程式提供静态档案,即使DEBUG设定为--insecure 通过使用此功能,您可以确认严重无效以及可能不安全 这只适用于本地开发,应从不用于生产,并且仅当staticfiles应用程序位于项目的INSTALLED_APPS设置时可用。 runserver --insecure不适用于CachedStaticFilesStorage

用法示例:

django-admin runserver --insecure

存储器¶ T0>

StaticFilesStorage

存储。 StaticFilesStorage T0> ¶ T1>

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

storage.StaticFilesStorage。post_process路径**选项

此方法在每次运行后由collectstatic管理命令调用,并将找到的文件的本地存储和路径作为字典以及命令行选项传递。

CachedStaticFilesStorage在幕后使用它来替换路径与它们的哈希对等体,并适当地更新缓存。

ManifestStaticFilesStorage

存储。 ManifestStaticFilesStorage T0> ¶ T1>

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

此存储的目的是为了在一些页面仍然引用这些文件的情况下继续提供旧文件,例如。因为它们由您或第三方代理服务器缓存。 此外,如果您希望将远期Expires标头应用于已部署的文件,以加快后续网页访问的加载时间,这将非常有帮助。

存储后端会自动使用缓存副本的路径(使用post_process()方法)替换保存的文件中与其他已保存文件匹配的路径。 默认情况下,用于查找这些路径(django.contrib.staticfiles.storage.HashedFilesMixin.patterns)的正则表达式涵盖@import规则和url() / t3> 级联样式表的语句。 例如,'css/styles.css'文件带有内容

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

将替换为调用ManifestStaticFilesStorage存储后端的url()方法,最终保存一个'css/styles.55e7cbb9ba48.css'具有以下内容:

@import url("../admin/css/base.27e20196a850.css");
storage.ManifestStaticFilesStorage。 max_post_process_passes T0> ¶ T1>

由于静态文件可能会引用需要更换其路径的其他静态文件,因此可能需要多次替换路径,直到文件哈希收敛。 为了防止由于散列不会收敛引起的无限循环(例如,如果'foo.css'引用'bar.css',引用'foo.css')在放弃后处理之前存在最大次数。 在大量引用的情况下,可能需要更多的通行证。 通过子类化ManifestStaticFilesStorage并设置max_post_process_passes属性来增加最大传递次数。 默认为5。

在Django更改1.11:

以前的版本没有进行多次传递,以确保文件散列会聚,所以经常多次文件散列不正确。 添加了max_post_process_passes属性。

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

在Django更改1.10:

在旧版本中,您还必须使用{% load static from staticfiles %} static模板标签({% load static %} / t3>)现在使用django.contrib.staticfiles如果已安装。

由于创建MD5哈希值会对运行时的网站造成负担,因此staticfiles会自动将所有已处理文件的哈希值映射存储在名为staticfiles.json 当您运行collectstatic管理命令时,会发生这种情况。

storage.ManifestStaticFilesStorage。 manifest_strict T0> ¶ T1>

如果在运行时在staticfiles.json清单中找不到文件,则会引发一个ValueError 可以通过将ManifestStaticFilesStorage并将manifest_strict属性设置为False来禁用此行为 - 不存在的路径将保持不变。

在Django更改1.11:

添加了manifest_strict属性。 在旧版本中,行为与manifest_strict=False相同。

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

storage.ManifestStaticFilesStorage。file_hashnamecontent = None

创建文件的散列名称时使用的方法。 需要返回给定文件名和内容的哈希值。 默认情况下,它从内容的块计算MD5哈希,如上所述。 随意覆盖此方法使用自己的哈希算法。

CachedStaticFilesStorage

存储。 CachedStaticFilesStorage T0> ¶ T1>

staticfiles.json类似于ManifestStaticFilesStorage类,但使用Django的caching framework来存储处理文件的哈希名称,而不是静态清单文件CachedStaticFilesStorage 这在您无权访问文件系统的情况下非常有用。

如果要覆盖存储使用的高速缓存后端的某些选项,只需在名为'staticfiles'CACHES设置中指定自定义条目即可。 它会回到使用'default'缓存后端。

警告

CachedStaticFilesStorage - 几乎所有情况下,ManifestStaticFilesStorage是一个更好的选择。 当使用CachedStaticFilesStorage时,由于缓存未命中需要在运行时使用散列文件,因此会导致多项性能下降。 远程文件存储需要几次往返,以缓存未命中的文件进行散列,因为需要几个文件访问来确保文件散列在嵌套文件路径的情况下是正确的。

Finders Module

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

from django.contrib.staticfiles import finders

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

其他助手

除了staticfiles应用程序之外还有一些其他助手可以使用静态文件:

静态文件开发视图

静态文件工具主要用于帮助将静态文件成功部署到生产环境中。 这通常意味着一个单独的,专用的静态文件服务器,这在开发本地时是很麻烦的开销。 因此,staticfiles应用程序附带了一个快速和脏的帮助视图,您可以使用它在开发中本地提供文件。

观点。服务请求路径

此视图函数在开发中提供静态文件。

警告

此视图仅在DEBUGTrue时有效。

这是因为此视图严重无效,可能不安全 这只适用于本地开发,应从不用于生产

要猜测提供的文件的内容类型,此视图依赖于来自Python标准库的mimetypes模块,该模块本身依赖于底层平台的映射文件。 如果您发现此视图没有为特定文件返回正确的内容类型,则很可能是平台的地图文件需要更新。 这可以通过在Debian发行版上安装或更新Red Hat发行版上的mailcap软件包或mime-support来实现。

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

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

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

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

由于这有点麻烦,还有一个帮助函数,将为你做这个:

网址。 staticfiles_urlpatterns T0>()¶ T1>

这将返回正确的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/,这个帮助功能才会工作。

这是因为此视图严重无效,可能不安全 这只适用于本地开发,应从不用于生产

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

测试。 StaticLiveServerTestCase T0> ¶ T1>

这个单元测试TestCase子类扩展django.test.LiveServerTestCase

就像父母一样,您可以使用它来编写涉及运行正在测试的代码的测试,并通过HTTP使用测试工具(例如Selenium,PhantomJS等)),因为需要静态资产也被发布。

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