Django 静态文件
静态文件是指在web服务中提供的如图片,js代码,CSS代码之类的文件。
1. 开发时的配置方法
在Django配置文件中INSTALLED_APPS中默认有一个django.contrib.staticfiles,
django通过这个APP来控制开发模式,也就是Debug = True时如何响应静态文件的请求
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
配置文件中默认还会有一个默认的静态文件URL配置,这个配置是客户端即浏览器访问静态文件的地址
如host为127.0.0.1,那么访问静态文件需要通过 http://127.0.0.1/static/some.png 访问一个some.png的图像。
STATIC_URL = '/static/'
那么服务器上去哪里找some.png这个文件呢,他首先会去配置中寻找STATICFILES_DIRS配置
这个配置默认是没有的,我们需要自己定义,这个配置需要是一个列表或元组,其中每一个元素是一个服务器本地路径
Django会按顺序寻找这个些路径下是否有请求的静态文件,some.png
STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), '/var/www/static/', ]
如果STATICFILES_DIRS中的路径都没有找到,再去找每一个APP目录下的static目录
Django就是按照这个顺序去寻找,如果都没有找到,就是404。
如果找到了,就立即返回,不会再继续,所以顺序很重要,STATICFILES_DIRS要比每个APP目录下面的static优先
这一套URL映射是由django.contrib.staticfiles 这个东西在Debug=True的情况下自动处理的
如果我们不想用这个django.contrib.staticfiles,可以在INSTALL_APPS中把它注释掉
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', # 'django.contrib.staticfiles', ]
然后在URL中手动去映射本地的静态文件,比如我想添加一个媒体类静态文件的映射
from django.conf import settings from django.urls import re_path from django.views.static import serve # ... the rest of your URLconf goes here ... if settings.DEBUG: urlpatterns += [ re_path(r'^media/(?P<path>.*)$', serve, { #MEDIA_ROOT在settings.py中配置成服务器本地的一个路径 'document_root': settings.MEDIA_ROOT, }), ]
也可以这样去映射
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)
2. 生产时的配置方法
开发模式使用django提供的方法来映射静态文件非常方便,
但是如果是生产环境还用这种方法,就会显得业余了,当然更重要的是不安全,静态文件的映射应该交给web服务器来做
首先还是在配置文件中配置一个STATIC_ROOT变量,配置成服务器上需要映射在静态文件目录,如
STATIC_ROOT = "/var/www/example.com/static/"
然后通过下面的命令,Django会把所有APP的static目录下的静态文件拷贝到STATIC_ROOT目录中,
如果有相同的文件,Django会拷贝那些最新修改的静态文件,这是通过文件的修改时间来判断的。
python manage.py collectstatic
这样我们就得到了Django项目的所有静态文件
接下来就是配置WEB服务器,在WEB服务器中映射STATIC_URL到STATIC_ROOT目录。
注意:使用collectstatic命令,必须INSTALL_APPS中有django.contrib.staticfiles,否则会报错Unknown command: 'collectstatic'
3. 模板中使用静态文件
在模板中使用静态文件,需要先加载static标签,再用相对路径访问静态文件
static 就代表了STATIC_ROOT目录(生产环境中)
或urlpatterns中的配置(开发环境中)
{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!">