Django里的STATIC_URL的作用

初学django,官方文档把我弄晕了,链接点了半天又回到了原点,来sf请教一下。
project名为newpro,app名为newapp,目录结构是这样的(略去了一些与问题无关的文件)

BASE_DIR
    manage.py
    static_root/
    newpro/
        settings.py
        urls.py
    newapp/
        urls.py
        views.py
        static/
            newapp/
                pic.png
        mystatic/
            newapp/
                pic.png
        templates/
            newapp/
                pic.html

下面是settings.py

# snap
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'newapp',
]
# snap
STATIC_URL = '/mystatic/'
STATIC_ROOT = 'static_root'

在就是pic.html(忽略其它)

{% load staticfiles %}
<img src="{% static 'newapp/pic.png' %}">

我发现模板html里用的是static/newapp/pic.png而非mystatic/newapp/pic.png,但是我在浏览器里查看源码,图片url是mystatic/newapp/pic.png.


提问

1.STATIC_URL的功能是否只是在我使用template tag方式修改模板时,在前面加上前缀(例子中的'/mystatic/' + 'newapp/pic.png'),而实际使用那个staticfile还是按照默认的在各个app下的static目录下查找
2.如果把STATIC_URL改成'mystatic/',发现无法显示图片,这好像就说明不是简单的加上前缀,为什么这样无法显示图片呢?模糊地认为是相对路径和绝对路径的问题
3.不用STATICFILES_DIRS是否可以做到搜索staticfiles时是在每个app下面的指定目录,如mystatic

阅读 6.2k
2 个回答
  1. 是的,STATIC_URL 只在乎 URL 前缀,查找时仍在 static 目录下查找

  2. 因为没有前导 /,变成了相对路径,故找不到

  3. 你可以自定义 STATICFILES_FINDERS: https://docs.djangoproject.co...

debug 模式下静态文件的前缀

不重要,线上依然会用 nginx 打静态文件

---- 分割线 ---

https://github.com/duoduo369/...,请看2年前的一个 demo 里面的 readme

核心位置我贴过来好了,其中没写的应该就是 static_url,这个就是在模板应用 static 关键字后会替换的字符串。

# python manage.py collectstatic 后文件会扔到STATIC_ROOT下面
STATIC_ROOT = './statics'

# django的模板会从这些目录下查找
TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates'),
)

# 开发时css的路径,collectstatic会从这里查找然后丢到STATIC_ROOT下
# 使用pipeline后会在静态文件中添加hash码,例如css/index.css
# collectstatic后会变成 css/index.as1df14jah8dfh.css
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static_dev"),
)

扩展 demo https://github.com/duoduo369/...

--- 继续分割 ---

所以线上到时候的操作是这样的,代码先 pull 到最新 master,执行 collectstatic 将静态文件打到特定目录(static_root),nginx路由配过去,当然如果你们自己接了 cdn,流程会有变化。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏