Django - 找不到静态文件

时间:2011-05-16 08:14:19

标签: django static-files

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

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

15 个答案:

答案 0 :(得分:78)

我困惑 STATIC_ROOT STATICFILES_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

答案 1 :(得分:22)

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

  • 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的查找器找到的目录中执行此操作,默认情况下,这些目录是静态/&#39; app子目录和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

     

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

     

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

答案 2 :(得分:11)

settings.py文件中只有两件事可以使你的静态文件服务。

1)STATIC_URL = '/static/'

2)

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

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

即便如此,如果您的静态文件未加载,那么原因是,您可能已经保留了

DEBUG = False

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

答案 3 :(得分:2)

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

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

如果没有它,你可能会遇到一些问题,比如没有检测到你的静态文件,基本上所有文件都涉及你的应用程序。尽管使用正确的答案建议它是正确的:

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

可能是其中一个错误,如果收到此错误,应该进行审核。

答案 4 :(得分:2)

我通过在INSTALLED_APPS中添加项目名称来解决此问题。enter image description here

答案 5 :(得分:1)

在您的cmd类型命令中 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'。 这对我有用。

答案 6 :(得分:1)

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

STATICFILES_DIRS=[STATIC_DIR]

答案 7 :(得分:1)

您的settings.py中可能包含以下内容:

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

“ DIRS”:[“模板”],

'APP_DIRS':是的,

“选项”:{
#...这里有一些选择...
},
}, ]

OR

STATIC_URL ='/ static /'

OR

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

答案 8 :(得分:1)

始终记住文件 settings.py 末尾的 Django 中的两件事

用于开发

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}
  ),
...
);

希望可以解决问题

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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

  

未找到:/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()

答案 11 :(得分:0)

我发现我将自己的DEBUG设置移动到了本地设置中,以被默认的False值覆盖。本质上,如果使用DEBUGrunserver进行开发,请确保DEBUG设置实际上为假。

答案 12 :(得分:0)

  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不应包含相同的目录。

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

答案 13 :(得分:0)

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

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

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

答案 14 :(得分:0)

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/'),
        ]