python - python Django: 在项目目录中不存在media_root的相对路径

  显示原文与译文双语对照的内容

我有一个 Django 应用程序,它显示由另一个监视应用程序创建的监视视频缩略图( 作为他们各自视频的超链接) 。

基本上,我有一个脚本,每半小时从监视应用程序存储位置到生产服务器将它们服务到 Django 应用程序的位置。

假设这些文件被移动到服务器上的这里位置:


/media/djangoAppMedia/



到目前为止,我已经将MEDIA_ROOT硬编码到这里路径:


MEDIA_ROOT = '/media/djangoAppMedia/'



我想将它改为一个相对路径,但所有我能找到的例子总是引用一个 root 应用程序项目。

Ex: MEDIA_ROOT = os.path.join(ENV_PATH, 'media/')

如何将媒体 root 设置为不在 Django 目录中的相对路径?

或者,我应该选择将这些文件移到项目中的媒体目录中? 或者,甚至使用 static?

因为我不像一般的媒体服务器那样,我觉得有些灰色区域,但是它们似乎不适合普通的Django static 使用用例。

时间: 原作者:

然后问题就变成了 relative? 当前目录的web服务器的生产观点可能令人惊讶。

如果你是指 relative 到源文件所在的位置,那么:


DIRNAME = os.path.dirname(__file__)


MEDIA_ROOT = os.path.join(DIRNAME, 'some', 'path', 'under', 'this', 'folder')



如果你意味着一个完全独立于项目的路径,那么你需要一些方法来找到它。 环境变量 是实现这里目的的一种方法:


MEDIA_ROOT = os.environ['MY_VIDEO_FILES']



你必须确保环境变量是由启动运行时环境设置的。

你当然可以在 settings.py 中使用if语句:


if DEBUG:


 MEDIA_ROOT = os.path.abspath('../../some/relative/path')


else:


 MEDIA_ROOT = '/some/absolute/path/on/prod/server'



这工作正常,并且最简单,特别是当你是唯一的开发者。

更新: Apache等。

启用 mod_env Apache MODULE 后,就可以定义 环境变量 ( 在你的虚拟环境中) 了:


SetEnv MEDIA_ROOT/absolute/path/to/media/root



这些都是:,所以你必须将 wsgi.py 文件更改为 Django ( 适应 http://ericplumb.com/blog/passing-apache-environment-variables-to-django-via-mod_wsgi.html ),


from django.core.wsgi import get_wsgi_application


_application = get_wsgi_application()



def application(environ, start_response):


 os.environ['MEDIA_ROOT'] = environ.get('MEDIA_ROOT', '')


 return _application(environ, start_response)



虽然有很多工作,但是如果你正在设置自己的服务器,那么它可能是 worthwile 。

使用 MEDIA_ROOT ='/media/' 很容易,让Apache为你重新定向它:


Alias/media//absolute/path/to/media/root



在你的设置中,你可以执行以下操作:


MEDIA_ROOT = os.environ.get("MEDIA_ROOT", '/media/')



在开发环境中定义环境变量。

ps: 根据你正在编写的软件( 比如 。 你可能不需要包含 settings.py 文件。

原作者:
...