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_ROOTMEDIA_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 在使用开发服务器时不会提供静态文件的主要内容,如果未能解决你的问题,请参考以下文章

Django提供静态文件服务

Heroku 上带有 gunicorn 服务器的 Django 项目不提供静态文件

如何在 Django 1.4 中为本地开发提供静态文件

从 django 静态文件提供服务并上传到 heroku 时无法找到反应静态文件

(Django 2.1)当媒体文件完美服务时,我无法提供静态文件?

Django:如何在生产中的apache服务器上部署静态文件