Django 在使用开发服务器时不会提供静态文件
Posted
技术标签:
【中文标题】Django 在使用开发服务器时不会提供静态文件【英文标题】:Django won't serve static files while using development server 【发布时间】:2011-10-10 16:09:41 【问题描述】:我刚刚为我正在开发的网站启动了一个新的开发服务器,但我似乎无法让 Django 开发服务器为我为 CSS 和其他东西提供的静态文件提供服务。管理站点的 CSS 加载正常。我在 virtualenv 沙箱中运行它。
在 settings.py 中,我弄乱了 MEDIA_ROOT 和 MEDIA_URL。
到目前为止,我已经尝试过 MEDIA_ROOT。
MEDIA_ROOT = '/home/wluw/wluw/wluw/media'
和
MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'media')
我将 ADMIN_MEDIA_PREFIX 更改为
ADMIN_MEDIA_PREFIX = '/admin_media/'
我的 MEDIA_URL 如下所示
MEDIA_URL = '/media/'
静态文件的 urls.py 部分如下所示。
if settings.DEBUG:
urlpatterns += patterns('',
(r'^media/(?P<path>.*)$', 'django.views.static.serve',
'document_root': settings.MEDIA_ROOT),
)
这是我尝试访问该页面时来自开发服务器的输出。
[21/Jul/2011 21:19:25] "GET /media/css/style.css HTTP/1.1" 302 0
[21/Jul/2011 21:19:25] "GET /media/css/style.css/ HTTP/1.1" 404 2561
from django.conf.urls.defaults import patterns, include, handler500, handler404
from django.conf import settings
from django.contrib import admin
import d51_django_admin_piston
handler500 = 'radio.frontend.views.server_error'
admin.autodiscover()
d51_django_admin_piston.autodiscover(admin.site)
urlpatterns = patterns(
'',
(r'^logs/', include('radio.logs.urls')),
(r'^events/', include('radio.events.urls')),
(r'^station/', include('radio.station.urls')),
(r'^staff/', include('radio.staff.urls')),
(r'^admin/', include(admin.site.urls)),
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
(r'^', include('radio.frontend.urls')),
)
if settings.DEBUG:
urlpatterns += patterns('',
(r'^media/(?P<path>.*)$', 'django.views.static.serve',
# 'document_root': settings.MEDIA_ROOT),
'document_root': settings.MEDIA_ROOT, 'show_indexes': True)
)
这是我的 radio.frontend.urls
from django.conf.urls.defaults import *
urlpatterns = patterns('radio.frontend.views',
url(r'^$', 'home', name='home'),
)
这是我的 settings.py settings.py
在具有 /media 的生产服务器上一切正常吗?作为css和其他东西的url。
也没有显示数据库中的任何内容。该站点的每个页面都是使用 base.html 和 viewname.html 创建的。只有 base.html 部分显示。不过,我确信这是另一个问题的主题。
我查看了大量其他有同样问题的人的帖子,但没有一个提供解决方案。我完全被难住了。
任何帮助将不胜感激。谢谢
【问题讨论】:
尝试在MEDIA_ROOT
的末尾添加一个/
,因为这就是我所拥有的,但我不记得它是否重要。自从我不得不建立一个新项目以来已经有一段时间了。
我试过了,还是不行。
添加 'document_root': settings.MEDIA_ROOT, 'show_indexes': True
并查看是否可以导航到该目录。您是否收到 404 错误?
看起来好像认为style.css是一个目录。
为什么它在寻找 /static/
而不是 /media/
?这就是我要问的。
【参考方案1】:
在 Django 1.3 中,MEDIA_ROOT
和 MEDIA_URL
用于配置用户上传的物理位置。
对于静态文件,您应该使用 STATIC_URL:
STATIC_URL = '/static/' # URL prefix for static files.
和STATICFILES_DIRS:
PROJECT_DIR = os.path.dirname(__file__)
# Additional locations of static files
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
os.path.join(PROJECT_DIR, 'static'),
)
还要确保您已配置 STATICFILES_FINDERS
。
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
在您的模板中,您可以使用 STATIC_URL 变量来访问静态文件的位置:
<link href=" STATIC_URL css/style.css" rel="stylesheet" type="text/css" />
对于开发环境/服务器来说应该足够了。不需要在 urls.py 中配置任何东西。
有关更多信息,您可以访问描述如何管理静态文件的官方 django 文档站点:https://docs.djangoproject.com/en/dev/howto/static-files/
【讨论】:
事情在生产服务器 MEDIA_ROOT 工作得很好。我不想浏览所有模板并将静态更改为媒体。另外,MEDIA_ROOT 需要使用一堆图像。 你认为我应该检查所有代码并将 mEDIA 更改为 STATIC @thebeagle 也许您的静态 url 和媒体根目录可以相同?【参考方案2】:您正尝试通过“/static/”而不是“/media/”访问您的静态文件,因为在您的 cmets 中您说:
"GET /static/css/style.css HTTP/1.1" 302 0 [21/Jul/2011 21:13:31] "GET /static/css/style.css/ HTTP/1.1" 404
您可以通过这种方式访问它:
"GET /media/css/style.css HTTP/1.1" 302 0 [21/Jul/2011 21:13:31] "GET /media/css/style.css/ HTTP/1.1" 404
然后你在你的模板中相应地设置你的 URL。
或者,您可以这样设置路由:
if settings.DEBUG:
urlpatterns += patterns('',
(r'^static/(?P<path>.*)$', 'django.views.static.serve',
# 'document_root': settings.MEDIA_ROOT),
'document_root': settings.MEDIA_ROOT, 'show_indexes': True)
)
我将选择第二个并设置settings.STATIC_FILE
,就像您通常使用MEDIA_ROOT
上传/下载内容一样。
【讨论】:
当我在玩不同的设置时,静态部分搞砸了。它现在读取 GET /media/css/style.css HTTP/1.1" 302 0 [21/Jul/2011 21:13:31] "GET /media/css/style.css/ HTTP/1.1" 404【参考方案3】:问题一定出在您的 urls.py
中,因为 AppendSlashMiddleware(导致重定向到以斜杠结尾的 URL 的原因)仅在 URL 根本不匹配时才会启动,并且从您所拥有的显示它应该匹配。
愚蠢的问题,但你确定DEBUG
是真的吗?你能显示其余的 urls.py 吗?你确定这是主要的 urls.py,而不是另一个包含的?
编辑好的,如果没有看到您的 radio.frontend.urls
文件,很难判断,但看起来正在发生的事情是所有 URL 都与之匹配 - 因为您使用 r'^'
包含它匹配所有内容,该文件中的某个内容也太笼统了。您可能想要分解第一个 urlpattern,并将包含 放在静态位之后。
【讨论】:
我将 urls.conf 添加到主帖 调试设置为真。我将发布一个指向我的 settings.py 的链接。 我会将我的 radio.frontend.urls 贴在原帖中。【参考方案4】:用于开发服务器
-
在 django 根目录下创建一个静态文件夹
将此添加到 settings.py 中的 STATIC_DIRS ('assets','path to the static folder')
将资源放在您之前创建的静态文件夹中的相应文件夹中
然后运行 python manage.py collectstatic。这将在 django 根目录中创建一个管理员和一个资产文件夹,其中包含您放置的资产
在模板中,在顶部添加 % load static %
对于链接,请使用 % static 'assets/path_to_resources_as_added_in_the_static_folder' %
这对我有用
【讨论】:
以上是关于Django 在使用开发服务器时不会提供静态文件的主要内容,如果未能解决你的问题,请参考以下文章
Heroku 上带有 gunicorn 服务器的 Django 项目不提供静态文件
从 django 静态文件提供服务并上传到 heroku 时无法找到反应静态文件