在 Django 开发期间提供静态媒体:为啥不 MEDIA_ROOT?

Posted

技术标签:

【中文标题】在 Django 开发期间提供静态媒体:为啥不 MEDIA_ROOT?【英文标题】:Serving static media during Django development: Why not MEDIA_ROOT?在 Django 开发期间提供静态媒体:为什么不 MEDIA_ROOT? 【发布时间】:2011-01-15 07:07:20 【问题描述】:

我阅读了 this guide 关于在开发期间使用 Django 提供静态媒体的信息。

我注意到MEDIA_URLMEDIA_ROOT 没有用于此。为什么?有什么区别?

我尝试用MEDIA_URLMEDIA_ROOT 来做,结果很奇怪。

【问题讨论】:

【参考方案1】:

在生产环境中,您会希望从前端 Web 服务器(Apache、nginx 等)提供媒体,以避免 Django/Python 进程的额外负载。 MEDIA_URL 和 MEDIA_ROOT 通常用于此目的。

运行内置的开发服务器,您需要在 url.py 文件中设置正确的 url - 我通常使用这样的东西:

from django.conf import settings

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

这会从您的设置文件中获取 MEDIA_ROOT,这意味着它适用于开发和直播。

【讨论】:

我的错误是 ADMIN_MEDIA_PREFIX 也被设置为 /media/,这导致事情无法正常工作。 这是文档推荐的方式docs.djangoproject.com/en/3.1/howto/static-files/…【参考方案2】:

直接来自 settings.py 中的 cmets...

MEDIA_ROOT

MEDIA_ROOT 是包含/home/media/media.lawrence.com/ 等媒体的目录的绝对路径。

MEDIA_URL

MEDIA_URL 是处理从MEDIA_ROOT 提供的媒体的 URL。如果有路径组件,请确保使用尾部斜杠(在其他情况下可选)。示例:“http://media.lawrence.com”、“http://example.com/media/”。

所以,改写这些...MEDIA_ROOT 是文件在系统上的物理位置,MEDIA_URL 是这些文件映射到的位置。在开发中,这可能并不总是可访问的,并且在大多数情况下,您的开发环境和生产环境并不相同,您将不得不返回并进行更改。另一件事是,当 Django 被设计为不为您提供静态内容时,这不是一个好的做法。

如果你打算在开发中使用它,我建议你使用limiting it to DEBUG=True的方法。当 DEBUG 设置为 True 时,告诉 Django 从临时位置提供静态内容是一种更好、更安全的做法。您不会在启用DEBUG 的情况下将您的网站投入生产,对吧?好吧,至少你不应该这样做。

这是我的实现方式:

settings.py:

STATIC_DOC_ROOT = os.path.join(os.getcwd(), 'site_media')

urls.py:

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

这样,我正在处理的任何项目都有一个site_media 目录,其中包含所有必要的媒体。在 dev 中它是独立的,我不需要翻转设置中的任何位,除了DEBUG,无论如何我都会这样做。

【讨论】:

调试应该是不必要的,因为对 URL 的任何请求都不应该命中 Django,并且应该由前端 Web 服务器在生产环境中提供服务;)【参考方案3】:

Django 文档推荐我为我的用例修改的以下方法:

urlpatterns = [
    # url patterns
]

from django.conf import settings

if settings.DEBUG:
    from django.conf.urls.static import static
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

注意:以上假设您已正确设置 MEDIA_URLMEDIA_ROOT

...这里是djangodocs linkslap。

【讨论】:

适用于 django 1.9 仅供参考,您不需要将“static(settings.MEDIAURL...)”调用包装在“if settings.DEBUG”中,因为该“静态”函数已经在内部执行此操作。您可以在 django/conf/urls/static.py 中查看它

以上是关于在 Django 开发期间提供静态媒体:为啥不 MEDIA_ROOT?的主要内容,如果未能解决你的问题,请参考以下文章

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

从 S3 提供 Django 的静态和媒体文件

静态 django 不调用媒体文件

Nginx 无法在数字海洋上提供 django 静态或媒体文件

无法在 cpanel django 上提供媒体文件

仅在我重新加载 django 服务器后才提供上传的媒体文件