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

22 投票
3 回答
15390 浏览
提问于 2025-04-15 19:06

我看了这个指南,里面讲的是在开发过程中如何用Django来处理静态文件。

我发现里面没有用到MEDIA_URLMEDIA_ROOT,这是什么原因呢?它们有什么区别呢?

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

3 个回答

14

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

... 这里有一个 Django文档的链接

22

直接从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本身设计的时候就不推荐它来处理静态内容,所以这样做并不是一个好习惯。

如果你打算在开发中使用这个,我建议你把它限制在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文件夹,里面放着所有需要的媒体文件。在开发阶段,它是自给自足的,我只需要调整DEBUG这个设置,其他的就不用动了。

28

在实际应用中,你会希望你的媒体文件(比如图片、视频等)是从前端的网络服务器(像Apache、Nginx之类的)来提供的,这样可以减少对Django/Python进程的额外负担。通常会用到MEDIA_URL和MEDIA_ROOT这两个设置。

如果你在使用内置的开发服务器,你需要在你的url.py文件中设置正确的链接。我通常会用类似下面的代码:

from django.conf import settings

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

这段代码会从你的设置文件中获取MEDIA_ROOT,这样在开发和上线的时候都能正常工作。

撰写回答