在Django开发中提供静态媒体:为什么不用MEDIA_ROOT?
我看了这个指南,里面讲的是在开发过程中如何用Django来处理静态文件。
我发现里面没有用到MEDIA_URL
和MEDIA_ROOT
,这是什么原因呢?它们有什么区别呢?
我试着用MEDIA_URL
和MEDIA_ROOT
来做,结果却很奇怪。
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_URL
和MEDIA_ROOT
... 这里有一个 Django文档的链接。
直接从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
这个设置,其他的就不用动了。
在实际应用中,你会希望你的媒体文件(比如图片、视频等)是从前端的网络服务器(像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,这样在开发和上线的时候都能正常工作。