静态文件处理
django.contrib.staticfiles
从你的应用(和其他你指定的地方)收集所有静态文件到同一个地方,这样产品就能很容易的被维护
看看这里
对于静态文件的应用和一些用法示例的介绍,请参阅管理静态文件(CSS,图像) . 如果你想知道如何部署静态文件, 请参阅 部署静态文件.
设置
查看staticfiles settings了解更多设置细节
管理命令
django.contrib.staticfiles
公开三个管理命令
搜集静态文件
django-admin collectstatic
搜集静态文件到 STATIC_ROOT
.
默认情况下,重复文件名以类似于模板分辨率工作原理的方式解析:将使用首先在指定位置之一找到的文件。如果您感到困惑,findstatic
命令可以帮助您显示找到的文件。
使用enabled finders
搜索文件。默认值是查看由STATICFILES_DIRS
中定义的所有位置以及在由INSTALLED_APPS
设置指定的应用程序的'static'
目录中定义的所有位置。
collectstatic
管理命令在每次运行后调用STATICFILES_STORAGE
的post_process()
方法,并传递管理所发现的路径列表命令。它还接收collectstatic
的所有命令行选项。默认情况下,它由CachedStaticFilesStorage
使用。
默认情况下,收集的文件从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(MyStaticFilesStorage, self).__init__(*args, **kwargs)
然后将STATICFILES_STORAGE
设置为'path.to.MyStaticFilesStorage'
。
New in Django 1.7:
覆盖file_permissions_mode
和directory_permissions_mode
的功能是Django 1.7中的新功能。以前,文件权限始终使用FILE_UPLOAD_PERMISSIONS
和始终使用的目录权限FILE_UPLOAD_DIRECTORY_PERMISSIONS
。
一些常用的选项是:
--noinput
不要提示用户输入任何类型。
-i
<pattern>
--ignore
<pattern>
忽略与此glob样式模式匹配的文件或目录。使用多次忽略更多。
-n
--dry-run
除了修改文件系统之外,执行所有操作。
-c
--clear
在尝试复制或链接原始文件之前清除现有文件。
-l
--link
创建指向每个文件的符号链接,而不是复制。
--no-post-process
不要调用配置的STATICFILES_STORAGE
存储后端的post_process()
方法。
--no-default-ignore
不要忽略常见的私有glob样式模式'CVS'
,'.*'
和'*~'
。
有关选项的完整列表,请参阅命令自己的帮助,运行:
$ python manage.py collectstatic --help
findstatic
django-admin 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
默认情况下,找到所有匹配的位置。要仅返回每个相对路径的第一个匹配,请使用--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
New in Django 1.7:
添加了搜索其目录的其他输出。
runserver
django-admin runserver
Overrides the core runserver
command if the staticfiles
app is installed
and adds automatic serving of static files and the following new options.
--nostatic
使用--nostatic
选项可以完全禁止使用应用程序提供静态文件。仅当应用位于项目的INSTALLED_APPS
设置中时,此选项才可用。
用法示例:
django-admin runserver --nostatic
--insecure
使用--insecure
选项强制使用应用程式提供静态档案,即使DEBUG
设定为False
通过使用此功能,您可以确认严重无效以及可能不安全。这只适用于本地开发,应从不用于生产,并且仅当应用程序位于项目的INSTALLED_APPS
设置时可用。runserver
--insecure
不适用于CachedStaticFilesStorage
。
用法示例:
django-admin runserver --insecure
存储
StaticFilesStorage
class storage.``StaticFilesStorage
使用STATIC_ROOT
设置作为基本文件系统位置和STATIC_URL
设置的FileSystemStorage
存储后端的子类分别作为基本URL。
storage.StaticFilesStorage.``post_process
(paths, **options)
此方法在每次运行后由collectstatic
管理命令调用,并将找到的文件的本地存储和路径作为字典以及命令行选项传递。
CachedStaticFilesStorage
在幕后使用它来替换路径与它们的哈希对等体,并适当地更新缓存。
ManifestStaticFilesStorage
New in Django 1.7.
class storage.``ManifestStaticFilesStorage
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");
要启用ManifestStaticFilesStorage
,您必须确保满足以下要求:
STATICFILES_STORAGE
设置设置为'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
DEBUG
设置为False
- 您可以使用
staticfiles
static
模板标记来引用模板中的静态文件 - 您已使用
collectstatic
管理命令收集了所有静态文件
由于创建MD5哈希值会对运行时的网站造成负担,因此staticfiles
会自动将所有已处理文件的哈希值映射存储在名为staticfiles.json
。当您运行collectstatic
管理命令时,会发生这种情况。
由于运行collectstatic
的要求,在运行测试时,通常不应使用此存储器,因为collectstatic
不作为正常测试设置的一部分运行。在测试期间,请确保STATICFILES_STORAGE
设置设置为像'django.contrib.staticfiles.storage.StaticFilesStorage'
(默认值)。
storage.ManifestStaticFilesStorage.``file_hash
(name, content=None)
创建文件的散列名称时使用的方法。需要返回给定文件名和内容的哈希值。默认情况下,它从内容的块计算MD5哈希,如上所述。随意覆盖此方法使用自己的哈希算法。
CachedStaticFilesStorage
class storage.``CachedStaticFilesStorage
CachedStaticFilesStorage
类似于ManifestStaticFilesStorage
类,但使用Django的caching framework来存储处理文件的哈希名称,而不是静态清单文件staticfiles.json
。这在您无权访问文件系统的情况下非常有用。
如果要覆盖存储使用的高速缓存后端的某些选项,只需在名为'staticfiles'
的CACHES
设置中指定自定义条目即可。它会回到使用'default'
缓存后端。
模板标签
静态的
使用配置的STATICFILES_STORAGE
存储来为给定的相对路径创建完整的网址,例如:
{% load static from staticfiles %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />
上一个示例等于使用"images/hi.jpg"
调用STATICFILES_STORAGE
实例的url
方法。这在使用非本地存储后端部署文件时特别有用,如Serving static files from a cloud service or CDN提供静态文件中所述。
如果您希望在不显示静态网址的情况下检索静态网址,则可以使用略有不同的调用:
{% load static from staticfiles %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}" alt="Hi!" />
查找模块
staticfiles
查找器具有searched_locations
属性,它是查找器搜索的目录路径的列表。用法示例:
from django.contrib.staticfiles import finders
result = finders.find('css/base.css')
searched_locations = finders.searched_locations
New in Django 1.7.
已添加searched_locations
属性。
其他帮助
除了staticfiles
应用程序之外还有一些其他助手可以使用静态文件:
django.template.context_processors.static()
上下文处理器,将STATIC_URL
添加到用RequestContext
上下文渲染的每个模板上下文。- 内置模板标记
static
,它接受一个路径,并使用静态前缀STATIC_URL
将其链接。 - 内置模板标记
get_static_prefix
用于将模板变量填充为静态前缀STATIC_URL
以用作变量或直接。 - 类似的模板标签
get_media_prefix
,其工作方式类似于get_static_prefix
,但使用MEDIA_URL
。
静态文件开发视图
静态文件工具主要用于帮助将静态文件成功部署到生产环境中。这通常意味着一个单独的,专用的静态文件服务器,这在开发本地时是很麻烦的开销。因此,staticfiles
应用程序附带了一个快速和脏的帮助视图,您可以使用它在开发中本地提供文件。
views.``serve
(request, path)
此视图函数在开发中提供静态文件。
警告
此视图仅在DEBUG
为True
时有效。
这是因为此视图严重无效,可能不安全。这只适用于本地开发,应从不用于生产。
Changed in Django 1.7:
当DEBUG
为False
时,此视图现在将引发Http404
异常而不是ImproperlyConfigured
。
注意
要猜测提供的文件的内容类型,此视图依赖于来自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
设置。
由于这有点麻烦,还有一个帮助函数,将为你做这个:
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
知道除了应用程序目录中的文件之外还要查找文件的位置。
警告
只有DEBUG
设置为 True
,并且 STATIC_URL
设置不为空和完整的URL路径,比如 http://static.example.com/
,这个帮助功能才会工作。
这是因为该视图 效率不高 并且很可能 不安全. 该视图仅适用于本地开发 ,而不应该用于项目实际生产环境.
Specialized test case to support ‘live testing’
class testing.``StaticLiveServerTestCase
这个单元测试TestCase子类扩展django.test.LiveServerTestCase
。
就像它的父类,你可以使用它来编写测试,涉及运行测试中的代码,并使用 HTTP测试工具(例如 Selenium,PhantomJS 等),因为它需要同时发布静态素材。
但是考虑到它使用了上面描述的django.contrib.staticfiles.views.serve()
视图,它可以在测试执行时透明地覆盖由staticfiles
finders。这意味着您不需要在测试设置之前或作为测试设置的一部分运行collectstatic
。
New in Django 1.7:
StaticLiveServerTestCase
是Django 1.7中的新功能。以前,它的功能由django.test.LiveServerTestCase
提供。