Django-找不到静态文件


80

我已经看到过数篇有关此问题的文章,但没有找到我的解决方案。

我正在尝试在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和图像指定模式?

Answers:


108

我混淆了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


2
没有urls.py应该像问题中一样(媒体也是如此)from django.conf import settings,当然不要忘记
Pierre de LESPINAY 2011年

我只想添加到此答案,不要错过。它应该是STATICFILES_DIRS。我做了STATICFILE_DIRS,让我发疯了45分钟,寻找错误。
尼古罗

1
我使用BASE_DIR内置的const代替,SITE_ROOT并且可以工作。
Maduka Jayalath

32

服务静态文件可以通过多种方式实现。这是我对自我的注意:

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

我更喜欢第一种方式,并且它的设置接近于文档中定义的方式,因此为了提供文件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/zh/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/


28

可能只有两件事settings.py会给您带来麻烦。

1) STATIC_URL = '/static/'

2)

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

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

即使这样,如果您的静态文件未加载,则原因是,您可能仍然

DEBUG = False

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


2
就我而言,这是我的调试环境变量为false。我把它设置为true,现在它的工作
斯米特·帕特尔

嗨..我尝试了所有提到的解决方案,但仍然可以得到404。有人可以帮忙吗?
Mukul_Vashistha

8

如果您的静态网址正确,但仍然:

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

也许是您的WSGI问题。

➡Config 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()

6
  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_DIRS并且STATIC_ROOT不应包含相同的目录。

我知道已经很久了,但希望新伙伴可以从中获得帮助


3

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

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

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

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

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


1

我发现我将DEBUG本地设置中的设置移动了,以被默认False值覆盖。从本质上讲,如果使用DEBUG和开发,请确保DEBUG设置实际上为false runserver


1

我通过在INSTALLED_APPS中添加项目名称来解决此问题。在此处输入图片说明


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

1
TEMPLATE_DIR=os.path.join(BASE_DIR,'templates')
STATIC_DIR=os.path.join(BASE_DIR,'static')

STATICFILES_DIRS=[STATIC_DIR]

0

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


0

如果您已经添加了django-storages模块(例如,要支持将文件上传到django应用程序中的S3),并且像我一样,您没有正确阅读该模块的文档,则只需从您的行中删除此行settings.py

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

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


0

STATICFILES_DIRS 在用于开发STATIC_ROOT生产

STATICFILES_DIRS 并且STATIC_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/'),
        ]

-1

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

否则会出现类似的错误 dictionary update sequence element #0 has length 6; 2 is required

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.