149

static root对事情感到困惑并想澄清一下。

要在 Django 中提供静态文件,以下内容应位于settings.pyand中urls.py

import os
PROJECT_DIR=os.path.dirname(__file__)

1. 应该收集静态文件的目录的绝对路径

STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')

2.静态文件的URL前缀

STATIC_URL = '/static/'

3.静态文件的附加位置

STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)

...并在urls.py以下几行中:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
    r'^static/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}
))

4.我们也使用python manage.py collectstatic

问题:

  1. 谁能向我解释一下工作流程:理想情况下应该如何做。截至目前,我将上述代码片段复制/粘贴到它们指定的位置,并继续在静态目录中创建新文件,它可以工作。但是,在我settings.STATIC_ROOT的 中,我指向了一个不同的目录。

  2. 如果有人能解释每个设置的工作流程,那就太好了:如何收集和管理文件,以及遵循什么好的做法。

谢谢。

4

4 回答 4

97

静态根

./manage.py collectstatic将收集用于部署的静态文件 的目录的绝对路径。例子:STATIC_ROOT="/var/www/example.com/static/"

现在该命令./manage.py collectstatic会将所有静态文件(即应用程序中的静态文件夹,所有路径中的静态文件)复制到目录/var/www/example.com/static/中。现在你只需要在 apache 或 nginx..etc 上提供这个目录。

STATIC_URL

提供目录中URL的静态文件STATIC_ROOT(由 Apache 或 nginx..etc 提供)。 示例:/static/http://static.example.com/

如果您设置STATIC_URL = 'http://static.example.com/',那么您必须通过 apache 或 nginx 在 url提供STATIC_ROOT文件夹(即) (以便您可以使用引用静态文件)"/var/www/example.com/static/"'http://static.example.com/''/var/www/example.com/static/jquery.js''http://static.example.com/jquery.js'

现在在您的 django-templates 中,您可以通过以下方式引用它:

{% load static %}
<script src="{% static "jquery.js" %}"></script>

这将呈现:

<script src="http://static.example.com/jquery.js"></script>
于 2013-09-05T06:09:37.067 回答
41

STATICFILES_DIRS:您可以在此处保留项目的静态文件,例如模板使用的静态文件。

STATIC_ROOT: 留空,当你这样做时manage.py collectstatic,它将搜索系统上的所有静态文件并将它们移动到这里。您的静态文件服务器应该映射到该文件夹​​,无论它位于何处。运行 collectstatic 后检查,你会发现 django 已经建立的目录结构。

- - - - 编辑 - - - - - - - -

正如@DarkCygnus 所指出的, STATIC_ROOT 应该指向文件系统上的一个目录,该文件夹应该是空的,因为它将由 Django 填充。

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

或者

STATIC_ROOT = '/opt/web/project/static_files'

--------结束编辑 -----

STATIC_URL: '/static/' 通常没问题,它只是静态文件的前缀。

于 2011-12-31T19:05:40.457 回答
2

上面的所有答案都很有帮助,但没有一个能解决我的问题。在我的生产文件中,我的 STATIC_URL 是https://<URL>/static并且我在我的 dev settings.py 文件中使用了相同的 STATIC_URL。

这会导致 django/conf/urls/static.py 中的静默失败。

测试elif not settings.DEBUG or '://' in prefix: 选取 URL 中的 '//' 并没有添加静态 URL 模式,导致找不到静态文件。

如果 Django 吐出一条错误消息说明您不能使用http(s)://withDEBUG = True

我不得不将 STATIC_URL 更改为 '/static/'

于 2019-01-13T17:23:20.947 回答
0

Django 3.1+之后,目录路径的配置略有变化,但是概念当然是一样的。

STATICFILES_DIRS

STATICFILES_DIRS = [
    BASE_DIR / 'static',
    BASE_DIR / 'app_1/static',
    BASE_DIR / 'app_2/static',
]

顾名思义,它是一个目录列表。它用于为静态文件指定多个目录。对于应用程序的可重用性而言最有用。每个应用程序都有其独立的目录,而不是所有静态文件的目录。就像每个应用程序的模板一样。

配置应用的静态文件目录:

=> my_app
    => static
        => my_app
            => css
            => js

在开发模式下,使用 command python manage.py runserver,Django 使用设置搜索静态文件STATICFILES_FINDERS。默认情况下,它会尝试在 STATICFILES_DIRS 设置中列出的文件夹中查找请求的静态文件。如果失败,Django 会尝试使用 查找文件django.contrib.staticfiles.finders.AppDirectoriesFinder,该文件在项目中每个已安装应用程序的静态文件夹中查找。

静态根

STATIC_ROOT = BASE_DIR / 'static'

它是python manage.py collectstatic将收集静态文件以进行部署的目录的绝对路径。例子:

/var/www/example.com/static/"

对于开发来说,配置是不必要的STATIC_ROOT,但对于生产来说却极为重要。这是 Nginx、Apache 服务器访问网站静态文件时要考虑的路径。

STATIC_URL

引用位于 STATIC_ROOT 中的静态文件时使用的 URL。示例:“static/”或“http://static.example.com/”

STATIC_URL = '/static/'

现在,假设我决定配置STATIC_URL='/asset/',那么我需要更改STATIC_ROOT=BASE_DIR / 'asset'并且我的目录的名称也应该是asset.

参考:

https://docs.djangoproject.com/en/4.0/ref/contrib/staticfiles/

于 2022-03-01T15:51:52.923 回答