关于静态文件的部分,有兴趣的可以去官网看看:
Django3.2 关于管理静态文件 (不必纠结Django是哪个版本,关于静态文件的配置的都一样)
当然,觉得官网介绍的太复杂的话,接下来可以看我写的部分:
假设创建了一个名为myweb的项目,那么项目文件目录应该是这样的:
C:\Users\Administrator\Desktop>django-admin startproject myweb
C:\Users\Administrator\Desktop>cd myweb
C:\Users\Administrator\Desktop\myweb>tree /f
文件夹 PATH 列表
卷序列号为 000000C9 E6A5:0777
C:.
│ manage.py #与manage.py同级的目录就是当前项目文件夹下
│
└─myweb
settings.py
urls.py
wsgi.py
__init__.py
关于静态文件的配置部分在settings.py文件中进行配置,那么。。。
Django有哪些关于静态文件的配置?
-
django.contrib.staticfiles
:创建项目后,默认就有,作用是用来处理静态文件的,但是只针对于debug=true,如果debug=false时,就无法正常使用了(之后会讲如何正确加载静态文件)。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles' #debug=true时,就由这里的配置处理静态文件
]
2.STATIC_ROOT
:这个是配置静态文件存放目录,另外一个作用就是运行收集静态文件的命令(关于命令的部分后面会讲)时,最终静态文件收集存放的位置,注意,这个配置只会在debug=false时生效(生产环境)(至于为什么之后会讲)。
#vim settings.py ->在settings.py中配置STATIC_ROOT
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
#指定当前项目目录下的static文件夹用于存放静态文件
# BASE_DIR指的是当前项目的路径,Django会自动帮我们处理
#os.path.join()会拼接后面的路径
-
STATIC_URL
:毫无疑问,这个是我们在编写HTML文件时,书写静态文件路径时用到的,例如我们在HTML文件中如果想加载某个静态文件时,就需要写出该文件的路径,有了这个配置后,我们就不需要写静态文件的具体路径
#Django默认配置
STATIC_URL = '/static/'
4.STATICFILES_DIRS
:在实际项目开发中,如果我们的静态文件存放在一个或多个目录时,可以定义一个列表,用于存储静态文件,django默认配置并没有这个配置,如果需要,请自己定义,当项目下存在一个或多个静态资源的目录时,非常适合这样定义。注意,这个配置只在debug=true时生效(开发环境)
#vim settings.py ->在settings.py中配置STATICFILES_DIRS
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'templates/frontweb/static'),
os.path.join(BASE_DIR, 'static'),
BASE_DIR / "static",
'/var/www/static/', #绝对路径,非相对路径
("downloads", "/opt/webfiles/stats"), #给文件夹起别名
#以上几种方法均可
os.path.join(BASE_DIR, '/static'),
#这种方式会找不到静态文件,os.path.join()方法会自动拼接‘/’,因此一定要注意,加了‘/’,就会出现找不到的情况
]
- 注:这里我们可以看到
STATIC_ROOT
和STATICFILES_DIRS
的作用实际上是类似的,因此,这两个配置并不需要同时定义,在开发时,我们可能会定义多个静态资源文件夹,但是最终项目还是要部署的,因此最后静态资源会统一进行收集,部署时,一般只需要定义STATIC_ROOT
这一个配置就好,并且如果同时用STATIC_ROOT
和STATICFILES_DIRS
的方式重复定义了同一个文件夹作为静态资源存放路径,反而会报错,例如:
# 这里进行了重复定义,程序会报错
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
#会报以下错误:
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:
ERRORS:
?: (staticfiles.E002) The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting.
System check identified 1 issue (0 silenced).
-
MEDIA_URL
:用法同STATIC_URL
,方便我们在编写代码时书写路径。
#vim setting.py -> MEDIA_ROOT配置
MEDIA_URL = '/media/'
-
MEDIA_ROOT
:作用同STATIC_ROOT,用于定义媒体资源存放路径。
#vim setting.py -> MEDIA_ROOT配置
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
可能会有疑问,既然已经有了static静态文件配置,为什么还要再配置media?
原因是分工不同,static存放的是静态资源,而media虽然也存放相关资源,但存放的是用户自己上传的资源,例如头像,文件等,这个时候放在static文件夹里面显然不合适。
因此,网站开发时所需的图片等静态资源是依然存放在static文件夹中,而不是media文件夹。
-
{% load static %}
:如果在HTML中使用了static方法引入的路径,就需要在HTML中引入,否则,文件将依然无法找到,下面举个例子,如何在HTML中正确引用静态资源。
{% load static %} #在此处引用static标签,
首页
#假设在static文件夹下存在picture,里面有一个名为1.png的文件,这两种方法都能成功加载出来
#css和js引用方法类似,不做演示
#第一种就是django提供的模板语法,因此使用前需要load static一下
#第二种是通过配置的STATIC_URL找到的该文件。
#这两种写法的好处就是当静态文件目录发生变化时,不需要再到HTML中手动修改,只需修改相应的配置即可。当然,你也可以通过写相对路径的方式成功加载。
8.templates
:定义HTML模板文件存放目录,如果你用的是pycharm的IDE的话,在创建项目时,可以根据配置自动创建一个templates目录,pycham会自动帮我们配置,如果没有配置,就需要手动创建,当然,你也可以选择自定义该目录
# vim ./setting.py ->配置templates模板文件夹
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
# 这里就是定义templates模板文件存放位置的配置,意思是当前项目文件下的templates文件夹,前提是templates文件夹存在
# 下面部分配置省略
},
]
9.collectstatic
:在项目部署时,我们还要进行静态文件的收集,如果手动收集静态文件的话,工程量无疑很大,而且部署后,debug肯定要改为debug=false
,这时如果不进行静态文件的收集的话,django自带的部分,如admin后台就会出现CSS无法加载的问题,因此,项目部署前,这个操作是是必须的。
django的django.contrib.staticfiles
提供了一个收集静态文件的命令:python manage.py collectstatic
,执行该命令后,会将静态文件收集到配置好的STATIC_ROOT
中
C:\Users\Administrator\Desktop\myweb>python manage.py collectstatic