【问题标题】:Django - Static file not foundDjango - 找不到静态文件
【发布时间】:2011-08-26 06:13:09
【问题描述】:

我已经看过几个关于这个问题的帖子,但没有找到我的解决方案。

我正在尝试在我的 Django 1.3 开发环境中提供静态文件。

这是我的设置

...
STATIC_ROOT = '/home/glide/Documents/django/cbox/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
  '/static/',
)
...

我的 urls.py

urlpatterns = patterns('',
...
  url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root', settings.STATIC_ROOT}
  ),
...
);

我的/home/glide/Documents/django/cbox/static/目录是这样的

css
  main.css
javascript
image

尝试访问 http://127.0.0.1:8000/static/css/main.css 时出现 404 错误。

我必须分别为 css、javascript 和图像指定模式吗?

【问题讨论】:

  • 一个提示人们可能会觉得有用 - 当 Debug 为 False 时,Django 不会提供静态内容(即 CSS 更改)

标签: django static-files


【解决方案1】:

我混淆了 STATIC_ROOTSTATICFILES_DIRS

其实我并没有真正理解 STATIC_ROOT 的实用性。我认为这是我必须放置常用文件的目录。此目录用于生产,这是collectstatic将放置(收集)静态文件的目录。

STATICFILES_DIRS 是我需要的。

由于我在开发环境中,我的解决方案是不使用 STATIC_ROOT(或指定其他路径)并将我的公共文件目录设置在 STATICFILES_DIRS

#STATIC_ROOT = (os.path.join(SITE_ROOT, 'static_files/'))
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
STATICFILES_DIRS = (
  os.path.join(SITE_ROOT, 'static/'),
)

别忘了from django.conf import settings

【讨论】:

  • 不,urls.py 应该像问题中一样(媒体也是如此),当然不要忘记from django.conf import settings
  • 我只是想补充一下这个答案,不要错过s。它应该是 STATICFILES_DIRS。我做了 STATICFILE_DIRS,让我疯狂 45 分钟寻找错误。
  • 我使用 BASE_DIR 内置 const 而不是 SITE_ROOT 并且它可以工作。
【解决方案2】:

服务静态文件可以通过多种方式实现;这是我给自己的笔记:

  • static/my_app/ 目录添加到my_app(请参阅下面有关命名空间的说明)
  • 定义一个新的顶级目录并将其添加到settings.py中的STATICFILES_DIRS(注意The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting

我更喜欢第一种方式,并且设置与defined in the documentation 的方式接近,因此为了提供文件admin-custom.css 以覆盖几个管理员样式,我有这样的设置:

.
├── my_app/
│   ├── static/
│   │   └── my_app/
│   │       └── admin-custom.css
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── static/
├── templates/
│   └── admin/
│       └── base.html
└── manage.py
# settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

然后像这样在模板中使用它:

# /templates/admin/base.html
{% extends "admin/base.html" %}
{% load static %}

{% block extrahead %}
    <link rel="stylesheet" href="{% static "my_app/admin-custom.css" %}">
{% endblock %}

在开发过程中,如果你使用 django.contrib.staticfiles [ed: 默认安装],这将在 DEBUG 设置为 True 时由 runserver 自动完成 [...]

https://docs.djangoproject.com/en/1.10/howto/static-files/

部署时,我运行 collectstatic 并使用 nginx 提供静态文件。


为我解决所有困惑的文档:

STATIC_ROOT

collectstatic 将收集用于部署的静态文件的目录的绝对路径。

...它不是永久存储静态文件的地方。您应该在 staticfiles 的查找器可以找到的目录中执行此操作,默认情况下,这些目录是 'static/' 应用程序子目录以及您包含在 STATICFILES_DIRS 中的任何目录。

https://docs.djangoproject.com/en/1.10/ref/settings/#static-root


静态文件命名空间

现在我们或许可以将静态文件直接放在 my_app/static/ 中(而不是创建另一个 my_app 子目录),但这实际上是个坏主意。 Django 将使用它找到的第一个名称匹配的静态文件,如果您在不同的应用程序中有一个同名的静态文件,Django 将无法区分它们。我们需要能够将 Django 指向正确的位置,而确保这一点的最简单方法是对它们进行命名空间。也就是说,将这些静态文件放在另一个以应用程序本身命名的目录中。

https://docs.djangoproject.com/en/1.10/howto/static-files/


STATICFILES_DIRS

您的项目可能还会包含未绑定到特定应用的静态资产。除了在应用程序中使用 static/ 目录之外,您还可以在设置文件中定义目录列表 (STATICFILES_DIRS),Django 也会在其中查找静态文件。

https://docs.djangoproject.com/en/1.10/howto/static-files/

【讨论】:

  • 使用my_app/static/my_app - 方法,在settings.py 中添加STATIC_ROOT = os.path.join(BASE_DIR, 'static') 行对我来说有所不同。现在,文件已正确找到。我的用例是将我的简历绑定到我的个人投资组合网页,如下所示(在 home.html 中):&lt;a href="{% static 'portfolio/CV_Andreas_Luckert.pdf' %}"&gt;CV&lt;/a&gt; where "portfolio" == my_app
【解决方案3】:

settings.py 中可能只有两件事会给您带来问题。

1)STATIC_URL = '/static/'

2)

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

并且您的静态文件应位于与项目设置文件位于同一目录中的静态目录下。

即使您的静态文件没有加载,原因是,您可能已经保留了

DEBUG = False

将其更改为 True(仅用于开发)。在生产中,只需将STATICFILES_DIRS 更改为静态文件所在的任何路径。

【讨论】:

  • 在我的情况下,我的调试环境变量是错误的。我将其设置为 true,现在它可以工作了
  • 嗨..我尝试了所有提到的解决方案,但它仍然给我 404。有人可以帮忙吗?
  • @Naren Yellavula 为什么它适用于 DEBUG = True?
【解决方案4】:

如果您的静态 URL 正确但仍然:

未找到:/static/css/main.css

也许是你的 WSGI 问题。

➡ 配置 WSGI 同时服务于开发环境和生产环境

==========================project/project/wsgi.py==========================

import os
from django.conf import settings
from django.contrib.staticfiles.handlers import StaticFilesHandler
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
if settings.DEBUG:
    application = StaticFilesHandler(get_wsgi_application())
else:
    application = get_wsgi_application()

【讨论】:

  • 对我来说,我使用 WSGI 并使用 gunicorn 发布。这对我有帮助.. 谢谢
【解决方案5】:
  1. 您可以删除STATIC_ROOT
  2. 或者您可以在不同的目录中创建另一个static 文件夹。假设目录为:project\static 现在更新:
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'project/static/')
    ]
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

无论你做什么,重点是STATICFILES_DIRSSTATIC_ROOT 不应该包含相同的目录。

我知道已经很久了,但希望新朋友可以从中得到帮助

【讨论】:

    【解决方案6】:

    另一个错误可能是您的应用未在 INSTALLED_APPS 列表中列出,例如:

    INSTALLED_APPS = [
        # ...
        'your_app',
    ]
    

    如果没有它,您可能会遇到诸如无法检测到静态文件(基本上是所有涉及您的应用程序的文件)的问题。即使它可以通过使用正确答案中的建议是正确的:

    STATICFILES_DIRS = (adding/path/of/your/app)
    

    可能是错误之一,如果出现此错误,应进行检查。

    【讨论】:

      【解决方案7】:

      STATICFILES_DIRS 用于开发STATIC_ROOT 用于生产

      STATICFILES_DIRSSTATIC_ROOT 不应具有相同的文件夹名称,

      如果您需要在开发和生产中使用完全相同的静态文件夹,请尝试此方法

      将此包含在settings.py

      import socket
      
      HOSTNAME = socket.gethostname()
      
      # if hostname same as production url name use STATIC_ROOT 
      if HOSTNAME == 'www.example.com':
          STATIC_ROOT = os.path.join(BASE_DIR, "static/")
      
      else:
          STATICFILES_DIRS = [
                  os.path.join(BASE_DIR, 'static/'),
              ]
      

      【讨论】:

        【解决方案8】:

        我通过在 INSTALLED_APPS. 中添加我的项目名称来解决这个问题

        【讨论】:

        • 这为我解决了这个问题,但我认为我可能需要一个更好的解决方案,每个应用程序都应该有自己的静态文件夹
        【解决方案9】:

        在你的 cmd 输入命令 python manage.py findstatic --verbosity 2 static 它将给出 Django 在其中查找静态文件的目录。如果您创建了一个虚拟环境,那么这个 virtual_environment_name 文件夹内将有一个静态文件夹。 VIRTUAL_ENVIRONMENT_NAME\Lib\site-packages\django\contrib\admin\static。 如果 Django 向您显示此路径,则在运行上述“findstatic”命令时,只需将所有静态文件粘贴到此静态目录中。 在您的 html 文件中,对 href 使用 JINJA 语法并检查其他内联 css。如果在给出 JINJA 语法后仍然有图像 src 或 url,则在其前面加上 '/static'。 这对我有用。

        【讨论】:

          【解决方案10】:
          TEMPLATE_DIR=os.path.join(BASE_DIR,'templates')
          STATIC_DIR=os.path.join(BASE_DIR,'static')
          
          STATICFILES_DIRS=[STATIC_DIR]
          

          【讨论】:

            【解决方案11】:

            我发现我在本地设置中移动了我的 DEBUG 设置以被默认的 False 值覆盖。如果您正在使用DEBUGrunserver 进行开发,则基本上要确保 DEBUG 设置实际上是错误的。

            【讨论】:

              【解决方案12】:

              你的 settings.py 中可能有以下内容:

              模板 = [
              {
              'BACKEND': 'django.template.backends.django.DjangoTemplates',

              'DIRS': ["templates"],

              'APP_DIRS': True ,

              '选项': {
              # ... 这里有一些选项...
              },
              }, ]

              STATIC_URL = '/static/'

              STATICFILES_DIRS = ( os.path.join(BASE_DIR, "静态"), )

              【讨论】:

                【解决方案13】:

                永远记住 Django 文件末尾的两件事 settings.py

                开发

                STATIC_URL = '/static/'
                

                用于生产

                STATIC_ROOT = '/static/'
                

                由于您是在开发环境中工作,因此将settings.py文件中的其他两条路径注释掉

                #STATIC_ROOT = '/home/glide/Documents/django/cbox/static/'
                STATIC_URL = '/static/'
                #STATICFILES_DIRS = (
                #  '/static/',
                #)
                

                对于urls.py进行如下修改

                urlpatterns = patterns('',
                ...
                  url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
                    {'document_root', settings.STATIC_URL}
                  ),
                ...
                );
                

                希望这可以解决问题

                【讨论】:

                  【解决方案14】:

                  如果您已经添加了django-storages 模块(例如,支持在您的 django 应用程序中将文件上传到 S3),并且如果您像我一样没有正确阅读 the documentation of this module,只需从您的 @987654323 中删除此行@:

                  STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
                  

                  否则,它将导致您的静态资产不在您的本地机器上,而是在 S3 存储桶中远程查看,包括管理面板 CSS,从而有效地破坏管理面板 CSS。

                  【讨论】:

                    【解决方案15】:

                    {'document_root', settings.STATIC_ROOT} 需要 {'document_root': settings.STATIC_ROOT}

                    否则你会得到一个错误 dictionary update sequence element #0 has length 6; 2 is required

                    【讨论】:

                      猜你喜欢
                      • 2021-08-27
                      • 2014-11-10
                      • 2020-06-22
                      • 2021-08-16
                      • 2020-06-20
                      • 2019-06-24
                      相关资源
                      最近更新 更多