Django: 1.8.7
在使用 django
开发中,不可避免的总会遇到静态文件的处理,特别对于前端来说,页面的调试都是依赖静态文件(JS,CSS,Image等等), Django
在静态文件处理这一块做的不错,但不是最优秀,毕竟 Django
只是一个框架而已,更多的业务需要搭配其他工具共同完成,这是后话。
Django
把静态文件分成了两类: static
和 media
,看了 Django
的文档之后,发现 Django
是按照是否与用户互动来进行区分的
static
: 应用页面需要的(JS, CSS, Image...),这些相对来说是提供给用户的,即这些文件(非严格讲)没有与用户进行互动,开发者产生这些文件为访问用户服务,用户只是单纯的享受应用服务。
media
: 用户与应用程序进行交互的文件(用户上传的文件等等)
Django
使用下面几项来处理 static
文件
STATIC_ROOT
STATIC_URL
STATICFILES_DIRS
STATICFILES_STORAGE
STATICFILES_FINDERS
每一项的具体作用不写了,不懂的可以去翻看官方文档,已经非常清晰。
2.1.1 在自定义的 STATICFILES_DIRS
寻找静态文件
保证 django.contrib.staticfiles
在 INSTALLED_APPS
中.
在 TEMPLATES
配置中添加 django.template.context_processors.static
在模板中使用 STATIC_URL
变量, eg:<img src="{{STATIC_URL}}girl.png>
2.1.2 在自定义的 STATIC_ROOT
寻找静态文件
如果你想访问静态文件时,静态文件在 STATIC_ROOT
中寻找
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # ... the rest of your URLconf goes here ... ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
这种方法不推荐,理由:开发过程中需要不断的执行 ./manage.py collectstatic
生产环境不同开发环境,生产环境下( DEBUG=False
), django.contrib.staticfiles
是不起任何作用的,也就说 django.contrib.staticfiles
只对开发环境( DEBUG=True
)开启
生产环境我们一般都是使用 web服务器
来管理静态文件,管理方法就不写了,不懂可以翻看文档
根据配置文件的不同( develop.py production.py
), 设置不同的 STATIC_URL
, 这样很容易结合 CDN
服务,生产环境配置 CDN
,这就扯到高并发去了
这个原理很简单,因为 django.contrib.staticfiles
在 INSTALLED_APPS
中, Django
自动加载 django.contrib.staticfiles
的 urls.py
, urls.py
源代码如下:
from django.conf import settings from django.conf.urls.static import static from django.contrib.staticfiles.views import serve urlpatterns = [] def staticfiles_urlpatterns(prefix=None): """ Helper function to return a URL pattern for serving static files. """ if prefix is None: prefix = settings.STATIC_URL return static(prefix, view=serve) # Only append if urlpatterns are empty if settings.DEBUG and not urlpatterns: urlpatterns += staticfiles_urlpatterns()
重点是 staticfiles_urlpatterns
这个函数,自动把 settings.STATIC_URL
作为前缀,这些细节我们都不用管, Django
都帮我们搞好了
media
这里不仅仅包含多媒体文件,包括用户上传的 文档
,自定义的 css
等等
Django 使用下面几项来处理 media
文件
MEDIA_ROOT
MEDIA_URL
以下是我使用方式
在 TEMPLATES 配置中添加 django.template.context_processors.media
修改 urls.py
入口文件
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # ... the rest of your URLconf goes here ... ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
在模板中直接使用 MEDIA_URL
变量.
<video width="320" height="240" controls="controls"> <source src="{{ MEDIA_URL }}movie.ogg" type="video/ogg"> <source src="{{ MEDIA_URL }}movie.mp4" type="video/mp4"> </video>
同 2.2
其实严格来说 media
文件都是静态文件,静态文件的打包,版本控制等等需要借助其他工具来完成(前端工程范畴),跟 static
最大的区别是否由用户产生,仅此而已。 Django-1.3
之前统一使用 media
进行管理,至于为了还会分出上面类型,不能预测
随着现代前端工程的发展, Django
处理静态资源不能满足我们的需要,当下还需要结合其他工具共同完成日益复杂的前端工程。