Django静态资源的路径主要通过STATIC_URL和STATICFILES_DIRS来设置,由此实现不同的管理方式。
管理方式
Django中管理静态资源一般有两种方式。
第一种是在每个应用(app)的目录下都有一个static文件夹,该应用的静态资源就存放在这里面。
目录结构如下:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
static/
blog/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
static/
第二种是在与应用同级的目录下创建一个static文件夹,然后再在这个文件夹中进行区分不同应用的静态资源,这种方式可以对所有静态进行统一的管理。
目录结构如下:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
blog/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
static/
setting.py中的设置
用上面的应用blog来举例,当访问blog应用中的网页时需要静态资源时,会去blog应用下的static文件夹中寻找。这种就是上面提到的第一种管理的方式。
STATIC_URL设置的是在访问静态资源时需要通过该url,例如要访问位于static文件夹下名为x的图片,那么可以这么访问 127.0.0.1:8000/static/x.jpg,如果修改STATIC_URL=’/top/,那么刚刚那样就不能再访问静态资源了,需要这样进行访问127.0.0.1:8000/static/x.jpg
Django有一个STATICFILES_DIRS能用来设置静态资源路径。
通常是这样的形式:
"""
Django官网的描述
如果你想用一个额外的命名空间来引用其中一个位置的文件,你可以可选的提供一 个前缀作为 (prefix, path) 的元组,例如:
"""
STATICFILES_DIRS = [
( BASE_DIR / "static"), # 设置一个总的静态资源路径
'/var/www/static/',
]
STATICFILES_DIRS 中可以指定多个静态资源路径,一般用于实现上面所说的第二种的管理方式。STATICFILES_DIRS指定一个static文件路径,然后所有应用的静态资源都存放在这个下面。
在使用第一种管理方式的时候,一般来说有些静态资源并不一定就是一个应用会使用到,有可能多个应用都要使用一些相同的静态资源,那么可以再使用第二种管理方式,将一些共用的资源放在一起。这时候就会出现一个问题,Django无法区分要使用本应用下的静态资源还是外层的静态资源,这时可以给外部静态资源路径添加一个prefix,用于区分。
STATICFILES_DIRS = [
# (prefix, path)
("out", BASE_DIR / "static"), # 设置一个总的静态资源路径
'/var/www/static/',
]
设置了prefix之后,可以用这样的形式来访问外层文件夹的静态资源(假设static下有bg.img这个文件):
{{ static "out/bg.img"}}
当需要访问外层静态资源就加上 设置的prefox/ 然后再加上资源的路径,访问本应用中的直接写资源路径即可。