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!">

 

posted @ 2020-06-07 19:26  人不知所  阅读(212)  评论(0)    收藏  举报