Django 找不到我的媒体文件(在开发服务器上)

Posted

技术标签:

【中文标题】Django 找不到我的媒体文件(在开发服务器上)【英文标题】:Django cannot find my media files (on development server) 【发布时间】:2012-02-28 09:42:42 【问题描述】:

媒体目前在我的本地开发机器上。

我的 MEDIA_ROOT、MEDIA_URL、ADMIN_MEDIA_PREFIX 并指定如下:

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), "media")
MEDIA_URL = '/media/'
SITE_URL = 'http://localhost:80'
ADMIN_MEDIA_PREFIX = '/media/admin/'

没有“管理员”文件夹,但我认为这不会有什么不同。 在 urls.py 文件中我有:

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

我不知道该怎么做才能让它工作。 [我正在尝试学习 django,并且正在处理一个非常复杂的现有项目]

【问题讨论】:

【参考方案1】:

您正在混合和匹配 Django 1.3 前后的静态文件处理。最初所有的静态文件都是从 MEDIA_URL 提供的,但是 Django 1.3 引入了 staticfiles contrib 包和相关的 STATIC_ROOTSTATIC_URL 设置。 django.views.static.serve 使用了您尚未设置的新静态文件应用程序。

假设您正在运行 Django 1.3,首先,您需要将“静态文件”添加到您的 INSTALLED_APPS。然后,您需要定义STATIC_ROOTSTATIC_URL。标准位置是一个名为“static”的项目根目录。

您还需要添加 staticfiles 模板上下文处理器:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'django.core.context_processors.static',
)

这将使STATIC_URL 变量在您的模板中可用,因此您可以使用 STATIC_URL css/style.css 之类的内容引用您的资源

您的所有静态资源还需要进入名为“static”的应用级目录。实际的项目根级“静态”目录从不直接使用。这只是collectstatic 管理命令转储所有静态资源以用于生产的地方。

如果您想要项目范围内的静态资源(不绑定到任何特定应用程序),您将需要一个完全独立的目录(即与 MEDIA_ROOT 不同 STATIC_ROOT) .我倾向于使用一个名为“资产”的东西。然后,您需要告诉 Django 在此处查找静态资源以及 STATICFILES_DIRS 设置:

STATICFILES_DIRS = (
    os.path.join(os.path.dirname(__file__), 'assets'), # or whatever you named it
)

MEDIA_ROOT/MEDIA_URL 现在仅用于用户上传(例如,通过FileFields 和ImageFields 创建的任何文件,因此您仍然需要它,但您永远不会手动存储任何内容。

当您进入生产阶段时,您的网络服务器将需要分别在MEDIA_URLSTATIC_URLMEDIA_ROOTSTATIC_ROOT 提供服务。您还需要运行:

$ python manage.py collectstatic

让Django将你所有的静态文件编译到STATIC_ROOT指定的目录中。

【讨论】:

哎呀,应该记得当代码来自 1.2 时我在 1.3 中工作,有没有办法让我不必在 1.2 代码中更改太多就能够在没有问题?或者我降级到 django 1.2 会更好吗? 还有一些其他设置,例如DATABASES,可能会给您弃用警告,或者可能需要进行修改以与 Django 1.3 兼容,但总体而言强制性更改相对较少。就个人而言,我建议坚持使用 1.3 并使应用程序正常工作。使其工作可能涉及的轻微工作远远超过静态文件、基于类的视图、改进的模板标签等的好处。另外,它将使最终跳转到 1.4 变得更容易,这几乎是必须的从我所看到的中解脱出来。【参考方案2】:

适用于 django 1.8 - 1.11:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

https://docs.djangoproject.com/en/1.11/howto/static-files/#serving-files-uploaded-by-a-user-during-development

请注意,Django 文档声明这是

不适合生产使用

(显然 除非你使用 if settings.DEBUG: 部分

【讨论】:

这里记录了 docs.djangoproject.com/en/1.10/howto/static-files/…,至少从 1.10 开始,您不需要 if settings.DEBUG: 位。您仍然需要根据您是否处于调试模式,有条件地配置 MEDIA_URLMEDIA_ROOT【参考方案3】:

在开发服务器上,此页面可能会对您有所帮助。 https://docs.djangoproject.com/en/1.2/howto/static-files/

通过在 urls.py 中添加以下代码:

if settings.DEBUG:
    urlpatterns += patterns('', 
        (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', 'document_root': '/path/to/media'),
    )

【讨论】:

【参考方案4】:

我使用 python-django 1.7

 if settings.DEBUG:
        urlpatterns = patterns('',
            (r'^$', 'blenderx3d.first_step.views.index'),
            (r'^media/(?P<path>.*)$','django.contrib.staticfiles.views.serve'),)

【讨论】:

以上是关于Django 找不到我的媒体文件(在开发服务器上)的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 视图中找不到静态文件

apache服务器在Django项目中找不到静态文件

Django findstatic:找不到匹配的文件

找不到静态文件 - 在 Heroku 上部署 Django

Django - 找不到静态文件

在生产服务器上找不到 Dajaxice