Django settings.py中的静态文件管理设置

1. STATIC_ROOT

官方文档上是这么说的:

Default: None
The absolute path to the directory where [collectstatic]  
 (https://docs.djangoproject.com/en/1.10/ref/contrib/staticfiles/#django-admin-collectstatic)  
 will collect static files for deployment. Example: "/var/www/example.com/static/"

说的是啥呢,就是说:这个字段的的目录路径是用来为部署而收集静态文件的地方。
更具体的说呢,当我们执行python manage.py collectstatic命令的时候,系统会帮我们把所有的静态文件都收集到该目录下。
很多时候,我们在settings.py文件中设置该字段时,是这么设置的:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

但是你也可以设置为任何你想要设置的目录,比如/var/www/example.com/static/
注意:一定是绝对路径哦。

2.STATIC_URL

首先。po出官方文档的说法:

Default: None

URL to use when referring to static files located in [STATIC_ROOT]  
(https://docs.djangoproject.com/en/1.10/ref/settings/#std:setting-STATIC_ROOT).  
Example: "/static/" or "http://static.example.com/"

If not None , this will be used as the base path for [asset definitions]  
(https://docs.djangoproject.com/en/1.10/topics/forms/media/#form-asset-paths) 
(the Media class) and the [staticfiles app]  
(https://docs.djangoproject.com/en/1.10/ref/contrib/staticfiles/).
It must end in a slash if set to a non-empty value.

说的就是,这个字段的值可以为空,也可以为一个string类型的url.主要作用就是当我们想要引用在STATIC_ROOT中静态文件时可以使用该url值,有图有真相:

Image 1.png
Image 3.png

当然了,你也可以把它设置为和STATIC_ROOT相同的路径值。还有留意一下官文中最后一句话:

It must end in a slash if set to a non-empty value.

就是说,如果该字段值不为空,必须在最后加上一个斜杠,那下面我就不加,看看会有什么效果。

Image 4.png

直接报错了,看来这个斜杠是必须要加的

3.STATICFILES_DIRS

我们依然先po出文档:

Default: []
 (Empty list)
This setting defines the additional locations the staticfiles app will traverse
 if the FileSystemFinder finder is enabled, e.g. if you use the[collectstatic]  
(https://docs.djangoproject.com/en/1.10/ref/contrib/staticfiles/#django-admin-collectstatic) 
or [findstatic](https://docs.djangoproject.com/en/1.10/ref/contrib/staticfiles/#django-admin-findstatic) 
management command or use the static file serving view.
This should be set to a list of strings that contain full paths to your additional files directory(ies)
 e.g.: STATICFILES_DIRS = [ "/home/special.polls.com/polls/static",
                   "/home/polls.com/polls/static", 
                   "/opt/webfiles/common",]

Note that these paths should use Unix-style forward slashes, 
even on Windows (e.g. "C:/Users/user/mysite/extra_static_content" ).

Prefixes (optional) (https://docs.djangoproject.com/en/1.10/ref/settings/#prefixes-optional)
In case you want to refer to files in one of the locations with an additional namespace, 
you can **optionally** provide a prefix as (prefix,path)  tuples, e.g.:
STATICFILES_DIRS = [ 
            # ... 
           ("downloads", "/opt/webfiles/stats"),]

For example, assuming you have [STATIC_URL]  
(https://docs.djangoproject.com/en/1.10/ref/settings/#std:setting-STATIC_URL)
 set to '/static/' , the [collectstatic]  
(https://docs.djangoproject.com/en/1.10/ref/contrib/staticfiles/#django-admin- collectstatic) 
management command would collect the “stats” files in a 'downloads' subdirectory of 
[STATIC_ROOT ](https://docs.djangoproject.com/en/1.10/ref/settings/#std:setting-STATIC_ROOT).  
This would allow you to refer to the local file '/opt/webfiles/stats/polls_20101022.tar.gz'
 with '/static/downloads/polls_20101022.tar.gz' in your templates,
 e.g.:
         <a href="{% static "downloads/polls_20101022.tar.gz" %}">

默认是一个空列表,如果我们开启了FileSystemFinder ,那么这个设置定义了staticfiles app将会遍历的一个附加的位置信息。
该值应该设置为一个字符串的列表形式,每个元素都是附加文件目录的绝对路径。
注意):这些路径都应该使用unix风格的斜杠,即便是在windows平台上("C:/Users/user/mysite/extra_static_content")
可选的前缀:如果你想在一个有附加命名空间的位置中引用文件,你可以使用一个元祖,把前缀加上。比如:现在我们的STATIC_URL的值设置为'/static/',STATICFILES_DIRS 设置为

STATICFILES_DIRS = [ 
            # ... 
           ("downloads", "/opt/webfiles/stats"),]

那么在执行collectstatic命令后,所有stats文件都将收在STATIC_ROOT的子目录downloads中。同时,当我们引用静态文件的时候,也可以直接使用/static/downloads/polls/...,而不使用opt/webfiles/stats/polls/...
如果还没看懂,下面我把图片例子po出来。

Image 5.png

然后执行命令python manage.py collectstatic

Image 6.png

引用静态文件的时候,可以使用下面的方式:

Image 7.png

4.MEDIA_ROOT

该设置项可以用来设置用户上传的文件的存放位置。值为路径字符串。

MEDIA_ROOT = os.path.join(BASE_DIR,'media')

举个例子
我在models中,实现一个model类

class ModelWithFileField(models.Model):
      file = models.FileField(upload_to='uploads/file/')
      upload = models.FileField(upload_to='uploads/%Y/%m/%d/')

字段的upload_to参数指定文件上传的位置。
在进行上传操作后,通过文件结构的变化可以发现发生了什么

image.png

5.待说明的地方:

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

推荐阅读更多精彩内容