21

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

我注意到了这一点MEDIA_URL,并MEDIA_ROOT没有在其中使用。为什么?有什么不同?

MEDIA_URL我试着用and来做MEDIA_ROOT,结果很奇怪。

4

3 回答 3

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}),
)

它从您的设置文件中获取 MEDIA_ROOT ,这意味着它适用于开发和生活。

于 2010-02-10T14:37:21.940 回答
22

直接来自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对吧?好吧,至少你不应该。

以下是我的实现方式:

设置.py:

STATIC_DOC_ROOT = os.path.join(os.getcwd(), 'site_media')

网址.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,无论如何我都会这样做。

于 2010-02-10T14:40:57.073 回答
13

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

于 2016-07-18T21:53:02.460 回答