Django 1.7 - 提供静态文件
我正在按照官方文档的指引来提供静态文件,但在开发控制台中收到了404错误。因为我使用了'django.contrib.staticfiles',所以静态文件应该会自动提供。以下是我的设置:
设置:
STATIC_ROOT = ''
STATIC_URL = '/static/'
模板头部:
{% load staticfiles %}
<link rel="stylesheet" href="{% static "css/app.css" %}">
目录结构:
django_project
\apps
\static
\css
app.css
\templates
index.html
我在Firefox控制台中看到我的文件路径是正确的:
所以问题可能是Django没有提供静态文件。我找不到我缺少了什么。任何建议都非常欢迎。
4 个回答
如果你在使用django-cms的时候遇到404错误(特别是你所有的静态文件的URL前面都加了“en-us”),我找到了一些步骤可以帮助你解决这个问题。
首先,在你的urls.py文件中关闭国际化的模式匹配,具体方法可以参考这里:
urlpatterns = i18n_patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('cms.urls')),
)
应该改成:
from django.conf.urls import patterns
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('cms.urls')),
)
这里的导入很重要,因为django-cms的配置会把patterns
从django.conf.urls
中移除。
这样解决了重定向的问题,但我的静态文件还是找不到。我需要手动把静态文件的URL添加到URL模式中,像这样:
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('cms.urls')),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
之后,静态文件就能正常工作了。
我知道这可能是因为我作为Django的新手搞错了配置。但因为其他人可能也会遇到同样的问题,所以我把这个作为一个可能的解决方案分享出来,虽然不是最理想的。
这应该没问题 :)
settings.py 文件
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'project', "static"),
)
这是 settings.py 文件中上下文处理器的一个例子:
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
'django.core.context_processors.request',
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages",
)
这是 settings.py 文件中已安装应用的一个例子:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
urls.py 文件:
from django.conf import settings
from django.conf.urls.static import static
if settings.DEBUG:
urlpatterns + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
当你运行 collectstatic 命令时,它会把你所有的静态文件放到你指定的 STATIC_ROOT 路径下。你可以查看一下 生产环境部署的文档。
如果你在使用 django 服务器,可以检查一下 {% static %} 生成的路径……可能是你多了一个斜杠或者少了什么东西。
确保你 满足所有要求。你需要在已安装的应用中包含 django.contrib.staticfiles,并且在你的主 urls 文件中需要有类似这样的内容:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = patterns('',
# ... the rest of your URLconf goes here ...
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
解决方案:我在settings.py文件里漏掉了这一行。
STATICFILES_DIRS = (os.path.join(os.path.dirname(__file__),'static'),)
看起来这行是必须的,就像TEMPLATE_DIRS一样。