Django 1.7 - 提供静态文件
Posted
技术标签:
【中文标题】Django 1.7 - 提供静态文件【英文标题】:Django 1.7 - Serving static files 【发布时间】:2014-12-22 05:26:18 【问题描述】:我正在关注official documentation 以提供静态文件,但我在开发控制台中收到错误 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 没有提供静态文件。我找不到我缺少的东西。任何建议都非常受欢迎。
【问题讨论】:
我认为代码有错字:"% static "css/app.css" %"
,你应该用单引号替换一对双引号。
【参考方案1】:
解决方案: 我的 settings.py 中缺少这一行
STATICFILES_DIRS = (os.path.join(os.path.dirname(__file__),'static'),)
看起来是强制的,和 TEMPLATE_DIRS 一样。
【讨论】:
我也尝试过使用 STATIC_ROOT,但在这个版本的 Django 中已弃用,所以只有 STATIC_URL、STATICFILES_DIRS 和 DEBUG=True 才需要。【参考方案2】:当您运行 collectstatic 时,它会将所有静态内容放在 STATIC_ROOT 指定的路径中。检查deploy to production docs
如果您使用的是 django 服务器,请尝试检查由 % static % 生成的路径...您可能有一些尾部斜杠或缺少某些内容。
检查您是否拥有following all the requirements。您需要在已安装的应用程序中包含 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)
【讨论】:
【参考方案3】:应该可以的:)
settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'project', "static"),
)
settings.py 中的 context_processors 示例:
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)
【讨论】:
实际上,您需要在 1.7 中提供静态文件的唯一内容是设置中的 STATIC_URL、STATICFILES_DIRS 和 'django.contrib.staticfiles'。然后你只需要在你的模板中使用任何静态文件,比如 % static "css/app.css" %。因此,幸运的是,您不需要像以前的版本那样在 urls.py 中显式提供静态文件。【参考方案4】:对于任何运行 django-cms 并遇到 404 错误的人(特别是,您的所有静态文件都在 URL 前加上“en-us”),我发现以下步骤可以提供帮助。
首先,在你的 urls.py 文件中关闭模式匹配的国际化 as described here:
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 的配置从 django.conf.urls
中删除了 patterns
导入。
这解决了重定向,但它仍然没有找到我的静态文件。我需要手动将静态 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 新手搞砸了我的配置有关。但由于其他人可能有同样的问题,我把它作为一个可能的解决方案,如果不太理想的话。
【讨论】:
以上是关于Django 1.7 - 提供静态文件的主要内容,如果未能解决你的问题,请参考以下文章
配置 STATIC_ROOT 时 Django 不提供静态文件