我已经看过几个关于这个问题的帖子,但没有找到我的解决方案。
我正在尝试在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和图像的模式?
我混淆了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
提供静态文件可以通过多种方式实现;这是我对自己的笔记:
static/my_app/
目录添加到my_app
(请参阅下面有关命名空间的说明)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将自动完成此操作[...]
在部署时,我运行collectstatic
并使用nginx提供静态文件。
文件清除了我的所有困惑:
STATIC_ROOT
collectstatic将收集静态文件以进行部署的目录的绝对路径。
...它不是永久存储静态文件的地方。您应该在staticfiles的finders找到的目录中执行此操作,默认情况下,这些目录是'static /'app子目录以及您在STATICFILES_DIRS中包含的任何目录。
https://docs.djangoproject.com/en/1.10/ref/settings/#static-root
静态文件命名空间
现在我们可以将我们的静态文件直接放在my_app / static /中(而不是创建另一个my_app子目录),但这实际上是个坏主意。 Django将使用它找到的名称匹配的第一个静态文件,如果在不同的应用程序中有一个具有相同名称的静态文件,Django将无法区分它们。我们需要能够将Django指向正确的,并且确保这一点的最简单方法是通过命名它们。也就是说,将这些静态文件放在为应用程序本身命名的另一个目录中。
STATICFILES_DIRS
您的项目可能还会包含与特定应用无关的静态资产。除了在应用程序中使用静态/目录外,您还可以在设置文件中定义目录列表(STATICFILES_DIRS),Django也会在其中查找静态文件。
在settings.py
文件中只有两件事可以使你的静态文件服务。
1)STATIC_URL = '/static/'
2)
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
并且您的静态文件应位于静态目录下,该目录与项目的设置文件位于同一目录中。
即便如此,如果您的静态文件未加载,那么原因是,您可能已保留
DEBUG = False
将其更改为True(严格仅限开发)。在生产中,只需将STATICFILES_DIRS
更改为静态文件所在的任何路径。
另一个错误可能是没有在INSTALLED_APPS
列表中列出您的应用,例如:
INSTALLED_APPS = [
# ...
'your_app',
]
没有它,你可能会面临诸如没有检测到静态文件,基本上所有涉及你的应用程序的文件的问题。即使通过使用正确的答案建议它是正确的:
STATICFILES_DIRS = (adding/path/of/your/app)
可能是其中一个错误,如果出现此错误,应该进行审核。
如果您的静态网址正确但仍然:
找不到:/static/css/main.css
也许是你的WSGI问题。
➡ConfigWSGI服务于开发环境和生产环境
==========================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()
{'document_root', settings.STATIC_ROOT}
需要是{'document_root': settings.STATIC_ROOT}
或者你会得到像dictionary update sequence element #0 has length 6; 2 is required
这样的错误
我发现我在我的本地设置中移动了我的DEBUG
设置被默认的False
值覆盖。基本上,如果您使用DEBUG
和runserver
进行开发,请确保DEBUG设置实际上是假的。