我有一个Django应用程序,显示由另一个监控应用程序创建的监控视频缩略图(作为各自视频的超链接),这种方式对我来说比监控应用程序本地显示更好。
基本上我有一个脚本可以将文件从监视应用程序存储位置每隔半小时移动到生产服务器将它们提供给Django应用程序的位置。
假设这些文件被移动到服务器上的这个位置:
void myFunction(int someParameter) { expression }
到目前为止,我已经将MEDIA_ROOT硬编码到这条道路上了:
/media/djangoAppMedia/
我想将此更改为相对路径,但我能找到的所有示例都始终引用Django主应用程序项目中的媒体根。
MEDIA_ROOT = '/media/djangoAppMedia/'
。
如何将媒体根目录设置为不在我的Django目录中的相对路径?
或者,或者,我应该将文件移动到项目中的媒体目录中吗?或者,甚至为这些使用静态?
我有一些灰色区域,因为这些文件不是“用户提交”,因为它似乎是媒体root的常用用例,但它们似乎也不适合正常的django静态用例。
答案 0 :(得分:1)
那么问题就变成了,相对于什么?生产网络服务器对当前目录的看法可能会令人惊讶。
如果您的意思是相对于源文件的位置,那么:
DIRNAME = os.path.dirname(__file__)
MEDIA_ROOT = os.path.join(DIRNAME, 'some', 'path', 'under', 'this', 'folder')
如果你的意思是完全独立于你的项目的路径,那么你需要一些方法在dev和prod上找到它。环境变量是实现此目的的一种方法:
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模块后,可以定义环境变量(在虚拟主机中):
SetEnv MEDIA_ROOT /absolute/path/to/media/root
那些是apache env vars,因此您必须更改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)
这需要做很多工作,但如果您正在设置自己的服务器,那么可能值得。
使用MEDIA_ROOT = '/media/'
更容易,让Apache为您重定向(在您的虚拟主机中):
Alias /media/ /absolute/path/to/media/root
在您的设置中,您可以执行以下操作:
MEDIA_ROOT = os.environ.get("MEDIA_ROOT", '/media/')
并在开发环境中定义环境变量。
ps:取决于您正在撰写的软件(例如可重复使用的软件包),您可能不需要包含settings.py
文件..