Django中静态文件之各个配置详解

关于静态文件的部分,有兴趣的可以去官网看看:
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有哪些关于静态文件的配置?
  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()会拼接后面的路径
  1. 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_ROOTSTATICFILES_DIRS的作用实际上是类似的,因此,这两个配置并不需要同时定义,在开发时,我们可能会定义多个静态资源文件夹,但是最终项目还是要部署的,因此最后静态资源会统一进行收集,部署时,一般只需要定义STATIC_ROOT这一个配置就好,并且如果同时用STATIC_ROOTSTATICFILES_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).
  1. MEDIA_URL:用法同STATIC_URL,方便我们在编写代码时书写路径。
    #vim setting.py    -> MEDIA_ROOT配置
    MEDIA_URL = '/media/'
  1. MEDIA_ROOT:作用同STATIC_ROOT,用于定义媒体资源存放路径。
    #vim setting.py    -> MEDIA_ROOT配置
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

可能会有疑问,既然已经有了static静态文件配置,为什么还要再配置media?
原因是分工不同,static存放的是静态资源,而media虽然也存放相关资源,但存放的是用户自己上传的资源,例如头像,文件等,这个时候放在static文件夹里面显然不合适。
因此,网站开发时所需的图片等静态资源是依然存放在static文件夹中,而不是media文件夹。

  1. {% load static %}:如果在HTML中使用了static方法引入的路径,就需要在HTML中引入,否则,文件将依然无法找到,下面举个例子,如何在HTML中正确引用静态资源。
<!DOCTYPE html>     
{% load static %}       #在此处引用static标签,
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
  #假设在static文件夹下存在picture,里面有一个名为1.png的文件,这两种方法都能成功加载出来
  #css和js引用方法类似,不做演示
<img src="{% static 'picture/1.png' %}" /> 
<img src="/static/picture/1.png" />
 #第一种就是django提供的模板语法,因此使用前需要load static一下
 #第二种是通过配置的STATIC_URL找到的该文件。
 #这两种写法的好处就是当静态文件目录发生变化时,不需要再到HTML中手动修改,只需修改相应的配置即可。当然,你也可以通过写相对路径的方式成功加载。
</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


这些就是关于静态资源配置的讲解了
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容