我在开发期间阅读了有关使用Django提供静态媒体的this guide。
我注意到MEDIA_URL
和MEDIA_ROOT
未在此使用。为什么?有什么区别?
我尝试使用MEDIA_URL
和MEDIA_ROOT
,并得到了奇怪的结果。
答案 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
是保存/home/media/media.lawrence.com/
等媒体的目录的绝对路径。
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_URL
和MEDIA_ROOT
......这是djangodocs linkslap。