静态文件(三) 静态文件app


本文译自Django官网。
适用:Django1.10
网址:https://docs.djangoproject.com/en/1.10/ref/contrib/staticfiles/


django.contrib.staticfiles从每个app(和指定的任何其他存放静态文件的地址)将静态文件收集到一个生产过程可以轻松提供的位置。

参考文件
管理静态文件(e.g. images,JavaScript,JavaScript,CSS)包括对静态文件app的介绍和一些用例。
部署静态文件提供部署静态文件的指导。


设置

有关以下设置的详细信息,请参阅staticfiles设置
[以下设置都位于project的setting.py文件中]


STATIC_ROOT

默认值:None
collectstatic为部署收集静态文件的绝对路径。
例如:"/var/www/example.com/static/"
如果启用了staticfiles contrib应用程序(与默认项目模板相同),则collectstatic管理命令将把静态文件收集到这个目录中。 使用情况的详细信息请参阅管理静态文件
警告:
这应该是一个空的目标目录,用于将静态文件从存储文职收集到一个方便部署的目录中,他不是永久存储静态文件的地方。应该将静态文件存储到静态文件查找器可以找到的目录(默认情况下为app的‘static'子目录和STATICFILES_DIRS包含的目录)。


STATIC_URL

默认值:None
引用位于STATIC_ROOT的静态文件时使用的URL。
例如:"/static/" or "http://static.example.com/"
如果不是None,它将被用作资源定义(Media类)和staticfiles应用程序的基本路径。

如果设置为非空值,则必须以斜杠结尾。

可能需要配置这些文件以为开发提供服务,在生产中肯定需要这样配置。


STATICFILES_DIRS

默认值:[](空列表)
此设置定义FileSystemFinder查找器启用时staticfiles应用程序将遍历的其他位置,例如,如果使用collectstatic或findstatic管理命令或使用静态文件服务视图。

此设置应该为其他文件目录的完整路径的字符串列表,例如:

STATICFILES_DIRS = [
    "/home/special.polls.com/polls/static",
    "/home/polls.com/polls/static",
    "/opt/webfiles/common",
]

注意,这些路径应该使用Unix风格的正斜杠,即使在Windows中(比如:"C:/Users/user/mysite/extra_static_content")也应该如此。


前缀(可选)

如果希望使用额外的命名空间引用某一位置的文件,则可以选择以元组的形式提供前缀,即(前缀,路径):

STATICFILES_DIRS = [
    # ...
    ("downloads", "/opt/webfiles/stats"),
]

例如,加入有一个设置为'/static/'的STATIC_URL,collectstatic管理命令将在STATIC_ROOT的“downloads”子目录中收集“stats”文件。
这将允许在模板中通过'/static/downloads/polls_20101022.tar.gz'引用本地文件'/opt/webfiles/stats/polls_20101022.tar.gz' :
<a href="{% static "downloads/polls_20101022.tar.gz" %}">


STATICFILES_STORAGE

默认值:'django.contrib.staticfiles.storage.StaticFilesStorage'
当使用collectstatic管理命令收集静态文件时使用的文件存储引擎。
可以在django.contrib.staticfiles.storage.staticfiles_storage中找到此设置中定义的存储后端的即用实例。
例如,详见从云端服务或CDN提供静态文件


STATICFILES_FINDERS

默认值:

[
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

知道如何在各个位置查找静态文件的查找后端列表。
默认情况下将找到存储在STATICFILES_IDRS设置的路径中的文件(使用django.contrib.staticfiles.finders.FileSystemFinder)和每个应用程序的static子目录中的文件(使用django.contrib.staticfiles.finders.AppDirectoriesFinder)。如果存在具有相同名称的多个文件,则将使用找到的第一个文件。
django.contrib.staticfiles.finders.DefaultStorageFinder查找器默认被禁用。如果将其添加到STATICFILES_FINDERS设置中,它将在DEFAULT_FILE_STORAGE设置中定义的默认文件存储中查找静态文件。
注意:
当使用AppDirectoriesFinder查找器时,确保app可以被静态文件找到(只需将应用程序添加到网站的INSTALLED_APPS设置中即可)。
静态文件查找器目前被认为是一个私有接口,因此这个接口没有正式文档。


管理命令

django.contrib.staticfiles提供了三个管理命令。


collectstatic

django-amdin collectstatic
将静态文件收集到STATIC_ROOT。
默认情况下,重复文件名解析方式与模板解决方案的工作方式类似:将使用指定位置找到的第一个文件。如果感到困惑,可以使用findstatic命令显示找到的所有文件。
后续collectstatic运行过程中(如果STATIC_ROOT不为空),只有当文件的修改时间戳大于STATIC_ROOT中文件的时间戳时才会复制文件。 因此,如果从INSTALLED_APPS中删除一个应用程序,最好使用collectstatic --clear选项来删除过时的静态文件。

通过启用的查找器搜索文件。默认情况为查找STATICFILES_DIRS定义的所有位置和INSTALLED_APP设置中指定的应用程序的’static‘子目录。

collectstatic管理命令在每次运行后调用STATICFILES_STORAGE的post_process()方法并传递管理命令找到的路径列表。 它还接收collectstatic的所有命令行选项,默认使用CachedStaticFilesStorage。
默认情况下,收集的文件从FILE_UPLOAD_PERMISSIONS获取权限,收集的目录从 FILE_UPLOAD_DIRECTORY_PERMISSIONS获取权限。 如果希望对这些文件和/或目录设置不同的权限,可以分类静态文件存储类并分别指定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'。
一些通用的选项为:
--noinput, --no-input
不要提示用户进行任何输入。
Django 1.9的变化:
添加了--no-input别名。
--ignore PATTERN, -i PATTERN
忽略与此glob样式模式匹配的文件或目录,多次使用会忽略更多。
--dry-run, -n
做除了修改文件系统的一切事情。
--clear, -c
在尝试复制或链接原始文件之前清理已存在的文件。
--link, -l
创建到每个文件的一个符号链接来代替复制。
--no-post-process
不调用指定的STATICFILES_STORAGE存储后端的post_process()方法。
--no-default-ignore
不要忽视普通的私有glob风格的CVS,'.*''*〜'

有关选项的完整列表,通过以下方式获得:
$ python manage.py collectstatic --help


自定义忽略的模式列表

Django1.10新特性。
默认忽略类型列表([’CVS‘,'.*''*〜']可以以更持久的方式进行自定义来代替每次收集调用时提供--ignore命令选项。提供一个自定义AppConfig类,重写该类的ignore_patterns属性并在 INSTALLED_APPS设置中用该类的路径代替'django.contrib.staticfiles':

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
默认情况下将会找到所有的路径。如果只需要为每个相对路径返回第一个匹配的结果,使用--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应用程序而且添加了静态文件自动提供服务,则重写核心runserver命令并具备以下新的选项。
--nostatic
使用--nostatic选项来禁用staticfile应用程序的静态文件服务。这个选项只有在项目的INSTALLED_APPS的设置中设置了staticfile应用程序的情况下才可用。用法示例:
django-admin runserver --nostatic

--insecure
使用--insecure选项在即使DEBUG为假的情况下强制使用静态文件应用程序提供静态文件。 通过这一点可以看到runserver是非常低效的,而且可能是不安全的。 它仅适用于本地开发,而不应在生产中使用,并且只有在项目的INSTALLED_APPS设置了静态应用程序时才可用。 runserver --insecure不用于CachedStaticFilesStorage。用法示例:
django-admin runserver --insecure


存储


StaticFilesStorage

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

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

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

CachedStaticFilesStorage在后台使用这些功能来替换其哈希对应的路径,并适当地更新缓存。


ManifestStaticFilesStorage

class storage.ManifestStaticFilesStorage
StaticFilesStorage存储后端的子类,它通过将文件内容的MD5哈希附加到文件名来存储文件名。例如,文件css/styles.css将被保存为css/styles.55e7cbb9ba48.css。
这种存储的目的是在一些页面仍然引用一些旧的文件的情况下继续提供旧它们,例如,由于它们被您或第三方代理服务器缓存。 另外,如果要将远期的Expires头部应用到部署的文件中以加快后续页面访问的加载时间,这是非常有帮助的。
存储后端将使用缓存副本(使用post_process()方法)的路径自动替换与其他保存文件匹配的保存文件中找到的路径。用于查找这些路径(django.contrib.staticfiles.storage.HashedFilesMixin.patterns)的正则表达式默认涵盖了层叠样式表的@import规则和url()语句。 例如,带有内容的'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
- 已经通过collectstatic管理命令收集了所有的静态文件。
Django1.10的变化:
在旧的版本中,需要在模板中使用{% load static from staticfiles %}。如果安装了django.contrib.staticfiles,static模板标签{% load static %}现在使用django.contrib.staticfiles。
由于创建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的缓存框架来存储处理文件的哈希名称来代替名为staticfiles.json的静态清单文件。 它对于无法访问文件系统的情况非常有用。
如果希望重写存储使用的缓存后端的特定选项,只需要在CACHES设置中指定一个名为staticfiles的自定义条目。它将回到使用“default”缓存后端。


查找器模块

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() 内容处理器将为使用RequestContent呈现的每个模板内容添加STATIC_URL。
- 内置模板标签static,它提取路径并使用静态前缀STATIC_URL整合路径。如果安装了django.contrib.staticfiles,标签使用STATICFILES_STORAGE的url()方法。
- 内置模板标签get_static_prefix,它使用静态前缀STATIC_URL填充模板变量,以将其用作变量或直接使用。
- 相似的模板标签get_media_prefix,与get_static_prefix工作方式类似但是使用MEDIA_URL。


静态文件开发视图

静态文件工具主要用于帮助将静态文件成功部署到生产环境中。这通常意味着一个独立的专用静态文件服务器(开发本地时需要很多额外开销)。 因此,staticfiles应用程序附带一个快速和脏的帮助器视图用于本地开发中提供文件。

views.server(request,path)

这个视图函数在开发过程中提供静态文件。
警告:
这个视图只在DEBUG为True时工作。
这是因为这个视图几乎没有效率而且很不安全。它只用于本地开发,而且永远都不应该用于生产。
注意:
为了猜测所提供文件的内容类型,此视图依赖于Python标准库中的mimetypes模块,该标准库本身依赖于底层平台的映射文件。如果发现此视图未返回特定文件的适当内容类型,则很可能需要更新平台的映射文件。这可以通过例如在Red Hat发行版上安装或更新mailcap软件包,或者在Debian发行版上进行mime支持来实现。
这个视图通过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设置既不为空也不是如http://static.example.com/的URL。
这是因为这种看法是非常低效的,可能是不安全的。 这只适用于本地开发,不应该在生产中使用。


支持“现场测试”的专用测试案例

class testing.StaticLiveServerTestCase
这个单元测试TestCase子类扩展了django.test.LiveServerTestCase。

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

但是鉴于使用上述django.contrib.staticfiles.views.serve()视图,它可以透明地覆盖测试执行期间静态文件查找器提供的资源。 这意味着不需要在测试设置之前或作为测试设置的一部分运行collectstatic。

转载于:https://my.oschina.net/u/3363145/blog/869991

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值