Django中静态文件之各个配置详解 2025-02-05 Python 暂无评论 14 次阅读 关于静态文件的部分,有兴趣的可以去官网看看: Django3.2 关于管理静态文件 (不必纠结Django是哪个版本,关于静态文件的配置的都一样) https://docs.djangoproject.com/zh-hans/3.2/howto/static-files/ 当然,觉得官网介绍的太复杂的话,接下来可以看我写的部分: 假设创建了一个名为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有哪些关于静态文件的配置? 1.`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()会拼接后面的路径 ``` 3.`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). ``` 5.`MEDIA_URL`:用法同STATIC_URL,方便我们在编写代码时书写路径。 ``` #vim setting.py -> MEDIA_ROOT配置 MEDIA_URL = '/media/' ``` 6.`MEDIA_ROOT`:作用同STATIC_ROOT,用于定义媒体资源存放路径。 ``` #vim setting.py -> MEDIA_ROOT配置 MEDIA_ROOT = os.path.join(BASE_DIR, 'media') ``` 可能会有疑问,既然已经有了static静态文件配置,为什么还要再配置media? 原因是分工不同,static存放的是静态资源,而media虽然也存放相关资源,但存放的是用户自己上传的资源,例如头像,文件等,这个时候放在static文件夹里面显然不合适。 因此,网站开发时所需的图片等静态资源是依然存放在static文件夹中,而不是media文件夹。 7.`{% 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 ``` 这些就是关于静态资源配置的讲解了 转自https://www.jianshu.com/p/5b7946f2f776 标签: django 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。