在Django中处理与应用无关的静态文件

5 投票
1 回答
2841 浏览
提问于 2025-04-18 02:07

在文档中 https://docs.djangoproject.com/en/dev/howto/static-files/

我看到静态文件应该放在各自的应用里,并通过下面的方式调用:

{% load staticfiles %}
<img src="{% static "articles/css/base.css" %}" alt="My image"/>

不过在文档后面提到,有些静态文件并不属于某个特定的应用。这时候就需要用到 STATICFILES_DIRS。如果我理解没错的话,STATICFILES_DIRS 是一个元组,用来告诉Django去哪里找其他的静态文件。我想知道,如何调用那些从 STATICFILES_DIRS 中找到的静态文件呢?

比如说,像这样:

<link rel="stylesheet" type="text/css" href="{% static "/css/default.css" %}">

另外,我不太确定我的 STATIC_ROOT 应该设置成什么。是留空吗?(''

我的项目结构是

mysite
  \articles
       \static
       \articles
           \css
               base.css
  \static
       \images
       \css
           default.css
       \js 
  \templates
       base.html
  \settings.py 

这是我在 settings.py 文件中关于静态文件的设置

# looks for static files in each app
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

STATICFILES_STORAGE = (
    'django.contrib.staticfiles.storage.StaticFilesStorage'
)

# the absolute path to the directory where collectstatic will collect static files for deployment (OUTPUT)
STATIC_ROOT = ''

# This setting defines the additional locations the static files app will traverse if the FileSystemFinder finder is enabled.
STATICFILES_DIRS = (
    # used for static assets that aren't tied to a particular app
     os.path.join(BASE_DIR, 'static'),
)

# URL to use when referring to static files located in STATIC_ROOT
STATIC_URL = '/static/'

1 个回答

3

关于Django的静态文件,几乎所有的内容都和 django.contrib.staticfiles 这个应用有关。虽然你需要调整很多设置才能让 staticfiles 正常工作,但它的功能其实很简单。它提供了一个 collectstatic 命令,可以把不同应用中的静态文件收集到一个目录里。

你第一个问题的答案也很简单:把那些常用的静态文件放在你Django项目目录下的 /static 目录里。在你的情况下,就是 mysite/static

原因有两个:首先,这是官方推荐的做法。你可以在官方文档中找到相关代码: 管理静态文件(CSS、图片)。其次,这样做也很合理。因为我们把只在单个应用中使用的静态文件放在 project/appname/static/... 下,所以项目的静态目录也应该遵循同样的命名规则。

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"), # That's it!!
    '/var/www/static/',
)

正如我在评论中提到的,你不应该把 STATIC_ROOT 设置为 project_absolutr_path/static。因为那个目录是用来放CSS应用的静态文件的。你不希望 collectstatic 命令把那个目录搞得一团糟,尤其是当你使用像git或svn这样的版本控制系统时。

STATIC_ROOT 的设置其实是根据你托管这些静态文件的方式而定的(比如Apache、Nginx、S3、CDN,或者像Heroku这样的PaaS)。

撰写回答