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

Ram*_*hum 21 python django static-media

我读了这篇关于在开发过程中使用Django提供静态媒体的指南.

我注意到了,MEDIA_URLMEDIA_ROOT没有在这里使用.为什么?有什么不同?

我试着做MEDIA_URLMEDIA_ROOT,并得到了奇怪的结果.

Fro*_*kys 28

在生产环境中,您需要从前端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}),
)
Run Code Online (Sandbox Code Playgroud)

从您的设置文件中选择MEDIA_ROOT意味着它适用于开发和实时.


jat*_*ism 21

直接来自settings.py中的评论......

MEDIA_ROOT

MEDIA_ROOT是保存媒体的目录的绝对路径,例如/home/media/media.lawrence.com/.

MEDIA_URL

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

因此,重新编写那些... MEDIA_ROOT文件在系统中实际存在的位置,以及MEDIA_URL这些文件映射到的位置.在开发过程中,这可能并不总是可访问的,并且在大多数情况下,您的开发环境和生产环境不一样,而且您将不得不返回并进行更改.另一件事是,当Django被设计为不为您提供静态内容时,它并不是一个好的做法.

如果您打算在开发中使用它,我建议您使用将其限制为DEBUG = True的方法.告诉Django在开发时从临时位置提供静态内容,当DEBUG设置为True更好,更安全的做法时.您不打算将您的网站投入生产DEBUG,对吗?好吧,至少你不应该.

这是我实现它的方式:

settings.py:

STATIC_DOC_ROOT = os.path.join(os.getcwd(), 'site_media')
Run Code Online (Sandbox Code Playgroud)

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}),
   )
Run Code Online (Sandbox Code Playgroud)

这样我正在处理的任何项目都有一个site_media目录,里面有所有必要的媒体.在开发中,它是独立的,我不必在设置中翻转任何位,除了DEBUG,无论如何我都会这样做.

  • +1用于指出`DEBUG`技巧.我总是用它. (5认同)
  • 调试不应该是必要的,因为对URL的任何请求都不应该命中Django并且应该由生产设置中的前端Web服务器提供服务;) (3认同)

rob*_*ach 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)
Run Code Online (Sandbox Code Playgroud)

注:上述假设你将自己MEDIA_URLMEDIA_ROOT正确

......这是djangodocs linkslap.

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