Tengo una aplicación Django que muestra miniaturas de videos de vigilancia (como hipervínculos a sus respectivos videos) creados por otra aplicación de vigilancia de una manera que me funciona mejor que la aplicación de vigilancia que los muestra de forma nativa.
Básicamente, tengo un script que mueve los archivos cada media hora desde la ubicación de almacenamiento de la aplicación de vigilancia hasta la ubicación en la que el servidor de producción los entregará a la aplicación Django.
Digamos que estos archivos se mueven a esta ubicación en el servidor:
/media/djangoAppMedia/Para el desarrollo hasta ahora, he tenido mi MEDIA_ROOT codificado en esta ruta:
MEDIA_ROOT = '/media/djangoAppMedia/'Me gustaría cambiar esto a una ruta relativa en el futuro, pero todos los ejemplos que puedo encontrar siempre hacen referencia a una raíz de medios que se encuentra dentro del proyecto principal de la aplicación Django.
Ex: MEDIA_ROOT = os.path.join(ENV_PATH, 'media/') .
¿Cómo puedo establecer mi raíz de medios en una ruta relativa que no está dentro de mi directorio de Django?
O, alternativamente, ¿debería mover los archivos a un directorio de medios dentro de mi proyecto? ¿O incluso usar estática para estos?
Hay un área gris para mí ya que estos archivos no son " enviados por el usuario " como parece ser el caso de uso habitual para la raíz de medios, pero tampoco parecen encajar en el caso de uso estático normal de django.
La pregunta entonces es, ¿en relación con qué? La opinión del servidor web de producción sobre cuál es el directorio actual puede ser sorprendente.
Si quisiste decir relativo a dónde está tu archivo fuente, entonces:
DIRNAME = os.path.dirname(__file__) MEDIA_ROOT = os.path.join(DIRNAME, 'some', 'path', 'under', 'this', 'folder')Si te refieres a una ruta completamente independiente de tu proyecto, entonces necesitarás alguna forma de encontrarla tanto en desarrollo como en producción. Las variables de entorno son una forma de hacer esto:
MEDIA_ROOT = os.environ['MY_VIDEO_FILES']tendrá que asegurarse de que la variable de entorno esté configurada por lo que sea que inicie su entorno de tiempo de ejecución.
Por supuesto, puede usar una declaración if en su configuración.py:
if DEBUG: MEDIA_ROOT = os.path.abspath('../../some/relative/path') else: MEDIA_ROOT = '/some/absolute/path/on/prod/server'esto funciona bien y es más fácil, especialmente si eres el único desarrollador.
Actualización: Apache, etc.
Con el módulo apache mod_env habilitado, es posible definir variables de entorno (en su host virtual):
SetEnv MEDIA_ROOT /absolute/path/to/media/root esos son apache env vars, por lo que tendrá que cambiar su archivo wsgi.py para llevarlos a Django (adaptado de 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)Eso es mucho trabajo, pero si está configurando su propio servidor, entonces podría valer la pena.
Es más fácil simplemente usar MEDIA_ROOT = '/media/' y dejar que Apache lo redirija por usted (en su host virtual):
Alias /media/ /absolute/path/to/media/rootEn su configuración, entonces podría hacer:
MEDIA_ROOT = os.environ.get("MEDIA_ROOT", '/media/')y defina la variable de entorno en su entorno de desarrollo.
PD: según el software que esté escribiendo (por ejemplo, paquetes reutilizables), es posible que no necesite incluir un archivo settings.py .