【问题标题】:MEDIA_ROOT: shall I hardcode the path or use os.path.join?MEDIA_ROOT:我应该硬编码路径还是使用 os.path.join?
【发布时间】:2017-05-02 10:03:13
【问题描述】:

Django 1.11

文档显示我们应该将图像放置到 /var/www//媒体/

https://docs.djangoproject.com/en/1.11/ref/settings/#media-root

但在《Two Scoops of Django》一书中,他们推荐:

# Configuring MEDIA_ROOT
# ’DONT DO THIS! Hardcoded to just one user's preferences
MEDIA_ROOT = "/Users/pydanny/twoscoops_project/media"

然后建议他们的方式:

root = lambda *dirs: join(abspath(BASE_DIR), *dirs)
# Configuring MEDIA_ROOT
MEDIA_ROOT = root("media")

你接受 Django 的两勺推荐的方式吗? 在这种情况下,MEDIA_ROOT 将位于项目本身内。这很糟糕,我想。这在某种程度上是代码和用户数据的混合体。

所以,我喜欢 Django 文档的建议:只需硬编码 /var/www/example.com/media/ 的路径。

MEDIA_ROOT 甚至不是 STATIC_ROOT。静态文件是从项目内部收集的。它们包含或多或少(CSS)代码的东西。而用户上传的文件肯定是数据,而不是代码。

你能评论一下吗?你的 MEDIA_ROOT 是什么样的? 我应该为我的本地机器和生产服务器使用不同的 MEDIA_ROOTS 吗?

【问题讨论】:

  • 我更喜欢使用硬编码。因此我有两个不同的settings.py;一台用于生产,一台用于开发机器。我必须注意,这不仅适用于媒体根设置,而且我还在 dev 和 prod 中以不同的方式使用其他设置。
  • 适合团队吗?您有一台用于生产的服务器。硬编码的内容并不可怕:它非常适合这个服务器。但是你的队友在他们自己的机器上工作。
  • 如果您不将开发 settings.py 添加到版本控制系统中。他们都可以拥有自己的开发 settings.py,因此将其用于团队并不难。
  • 您的 media_root 是否指向 var/www/?我的意思是“www”具有以下权限: drwxr-xr-x 5 root root 。这在某种程度上可能不是很方便。如果在 www 中创建目录,则必须允许 django 进程在其中写入。
  • 不,它不包含 所以它不在我的项目文件夹下它也不会打扰版本控制系统。我也不将我的项目保存在 /var/www/ 下,我通常使用我在服务器上创建的其他路径。

标签: django


【解决方案1】:

我曾经使用过以下:

ENV_PATH = os.path.abspath(os.path.dirname(__file__))
MEDIA_ROOT = os.path.join(ENV_PATH, 'media/')

这会自动检测到 settings.py 文件的绝对路径并创建 media_root 路径。

【讨论】:

  • 项目内部?我的意思是,为什么它在项目内部而不是在 var/www 中?
  • 是的,您可以创建 .env 文件并将您的 media_root 设置为您想要的任何位置。创建 .env 文件不是惯例,而是一种有效的方式,以便我们可以在单个文件中进行更改。
  • 为什么将上传的文件保存在项目中?有用吗?
  • 根据 django 文档,它给出了一个绝对路径的例子:docs.djangoproject.com/en/1.11/ref/settings/#media-root 没有关于偏好或有益部分的内容。
  • 没有。它不仅仅是绝对路径的一个例子。该文档教授最佳实践。在讨论对 Django 文档的改进时,经常会提到它。
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 2023-03-09
  • 2012-10-13
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多