在 Django 开发期间提供静态媒体:为啥不 MEDIA_ROOT?
Posted
技术标签:
【中文标题】在 Django 开发期间提供静态媒体:为啥不 MEDIA_ROOT?【英文标题】:Serving static media during Django development: Why not MEDIA_ROOT?在 Django 开发期间提供静态媒体:为什么不 MEDIA_ROOT? 【发布时间】:2011-01-15 07:07:20 【问题描述】:我阅读了 this guide 关于在开发期间使用 Django 提供静态媒体的信息。
我注意到MEDIA_URL
和MEDIA_ROOT
没有用于此。为什么?有什么区别?
我尝试用MEDIA_URL
和MEDIA_ROOT
来做,结果很奇怪。
【问题讨论】:
【参考方案1】:在生产环境中,您会希望从前端 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,这意味着它适用于开发和直播。
【讨论】:
我的错误是ADMIN_MEDIA_PREFIX
也被设置为 /media/
,这导致事情无法正常工作。
这是文档推荐的方式docs.djangoproject.com/en/3.1/howto/static-files/…【参考方案2】:
直接来自 settings.py 中的 cmets...
MEDIA_ROOT
MEDIA_ROOT
是包含/home/media/media.lawrence.com/
等媒体的目录的绝对路径。
MEDIA_URL
MEDIA_URL
是处理从MEDIA_ROOT
提供的媒体的 URL。如果有路径组件,请确保使用尾部斜杠(在其他情况下可选)。示例:“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
,无论如何我都会这样做。
【讨论】:
调试应该是不必要的,因为对 URL 的任何请求都不应该命中 Django,并且应该由前端 Web 服务器在生产环境中提供服务;)【参考方案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
...这里是djangodocs linkslap。
【讨论】:
适用于 django 1.9 仅供参考,您不需要将“static(settings.MEDIAURL...)”调用包装在“if settings.DEBUG”中,因为该“静态”函数已经在内部执行此操作。您可以在 django/conf/urls/static.py 中查看它以上是关于在 Django 开发期间提供静态媒体:为啥不 MEDIA_ROOT?的主要内容,如果未能解决你的问题,请参考以下文章
(Django 2.1)当媒体文件完美服务时,我无法提供静态文件?