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

时间:2010-02-10 14:21:59

标签: python django static-media

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

我注意到MEDIA_URLMEDIA_ROOT未在此使用。为什么?有什么区别?

我尝试使用MEDIA_URLMEDIA_ROOT,并得到了奇怪的结果。

3 个答案:

答案 0 :(得分:27)

在生产环境中,您需要从前端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,这意味着它适用于开发和实时。

答案 1 :(得分:21)

直接来自settings.py ...

中的评论

MEDIA_ROOT

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

MEDIA_URL

MEDIA_URL是处理从MEDIA_ROOT投放的媒体的网址。如果存在路径组件,请确保使用尾部斜杠(在其他情况下是可选的)。示例:“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之外,我不必在设置中翻转任何位,无论如何我都会这样做。

答案 2 :(得分:11)

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