【问题标题】:Django 1.4 serving media files works, but not staticDjango 1.4 服务媒体文件有效,但不是静态的
【发布时间】:2013-05-15 02:16:42
【问题描述】:

我正在使用 Django 1.4,出于某种原因,我能够提供媒体文件,但不能提供静态文件... 这是我的代码: 设置:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
STATIC_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/static/admin/'

urls.py:

(r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),
                    (r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.STATIC_ROOT}),

base.html:

<link href="{{ STATIC_URL }}css/bootstrap.css" rel="stylesheet">
<link href="{{ MEDIA_URL }}css/bootstrap-colorpicker.css" rel="stylesheet">

我得到一个 404 http not found...我做错了什么?我确实在媒体旁边的项目中创建了静态文件夹

http://mysite.com:8000/static/css/bootstrap.css

【问题讨论】:

  • 您的 INSTALLED_APPS 中是否有 django.contrib.staticfiles,这是一个 DEBUG=True 的开发站点吗?
  • 对这两个问题都是肯定的...顺便说一句,在生产中我应该将 DEBUG 设置为 false 吗??
  • 试过了,但没有成功
  • ADMIN_MEDIA_PREFIX 在 Django 1.4 中已弃用。此外,建议使用 os STATIC_URL {% static "css/bootstrap.css" %}

标签: python django python-2.7 http-status-code-404 django-staticfiles


【解决方案1】:

这是我在 settings.py 中定义媒体网址的方式:

import os
ABSOLUTE_PATH           = os.path.dirname(__file__)
MEDIA_ROOT              = os.path.join(ABSOLUTE_PATH, '../media')
MEDIA_URL               = '/media/'
STATIC_ROOT             = os.path.join(ABSOLUTE_PATH, '../static')
STATIC_URL              = "/static/"

所以就像你看到的区别是 ../media 和 ../static

mysite 在您安装的应用程序中吗? Django 查看您安装的应用程序并检查那里是否有静态文件夹。

【讨论】:

  • 你的静态文件夹在哪里?
  • /home/username/git/mysite/mysite/static
  • 你的 settings.py 在 /home/username/git/mysite/mysite/settings.py 吗?和 /home/username/git/mysite 你的项目文件夹?
  • 另一种想法,确认你的设置文件中有这个:STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', )
  • 这里是 /home/username/git/mysite/mysite/settings.py
【解决方案2】:

我建议删除显式媒体和静态视图并允许静态文件应用程序创建它们(当 DEBUG 为 True 正在开发中时)。

检查您的 settings.py 中是否存在默认查找器 https://docs.djangoproject.com/en/1.4/ref/contrib/staticfiles/#std:setting-STATICFILES_FINDERS

将您的项目静态目录添加到 STATICFILES_DIRS (https://docs.djangoproject.com/en/1.4/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS) 或将应用特定的静态文件夹放在每个应用下。该应用需要在 INSTALLED_APPS 中列出,以便查找器定位静态内容。

不要自己将静态文件放入 STATIC_ROOT。此目录由 collectstatic 命令管理。见https://docs.djangoproject.com/en/dev/howto/static-files/#deployment

【讨论】:

  • 存在默认查找器。我尝试将 os.path.join(BASE_DIR, 'static/'), 添加到 STATICFILES_DIRS 没有运气..这就是你的建议吗?我想将我的静态文件保存在一个地方,就像项目目录一样,而不是在应用程序中,因为我有一些公共资源
  • 我不确定我是否理解.. 我没有 /static 的视图.. 只有 urls 中的路由和我的 settings.py 中的其余部分
  • 从 urls.py 中删除静态条目。此外,“STATIC_ROOT”不应该是保存项目静态文件的地方。 'STATIC_ROOT' 目录是 'collectstatic' 命令将放置所有静态内容以供在生产环境中使用的位置。
  • 我这样做了,它只创建了管理静态文件。它似乎由于某种原因无法识别我的其他静态文件
  • 项目静态文件根目录的完整路径是什么?那就是您添加到 STATICFILES_DIRS 的路径。它应该与 STATIC_ROOT 相同。由于这是应用程序之外的目录,因此您无需将其添加到 INSTALLED_APPS。运行 collectstatic 会将所有已知的静态内容复制到 STATIC_ROOT,因此这是一个很好的测试来查看所找到的静态内容。在开发过程中,您不会从 STATIC_ROOT 提供文件,应该使用 staticfiles 应用程序自动提供它们。无需将静态 URL 添加到 urls.py。
【解决方案3】:

您的静态文件夹应位于您使用它的一个应用程序下。

例如,我有一个名为my_project 的项目和一个名为my_app 的应用程序,我有一些在my_app 中使用的静态文件,所以我将它们放在~/project_path/my_project/my_app/static

注意: my_app 必须在 INSTALLED_APPS 中。见STATICFILES_FINDERSdocumentation

编辑:

作为最佳实践,您应该在一个应用程序(主应用程序)中拥有一个全局静态文件夹,例如一个静态文件夹如何包含您的 html 模板基本资源,如 jquery、bootstrap、您的全局样式。

对于静态文件,只有一个应用程序需要,例如应用程序foo,这些文件应位于foo/static 文件夹下

【讨论】:

  • 如果我需要为 2 个或更多应用程序提供相同的静态文件怎么办?我复制文件或收集静态自动检测并仅使用 1?
  • 是的,它只使用一个文件,就像@Andrew S 说的那样,我们使用 collectstatic 来测试 Django 是否找到静态文件夹,但它仅用于生产(例如用于 apache)。如果将来您要删除一个应用程序,它不会感染您的其他应用程序,因为任何应用程序都是静态文件夹彼此独立,这就是诀窍!
  • 谢谢 - 花了一个小时试图调试这个。
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 2014-07-07
  • 2018-02-20
  • 2018-10-06
  • 2021-06-04
  • 1970-01-01
  • 2012-07-14
  • 2012-04-29
相关资源
最近更新 更多