template - Obtener la ruta absoluta de la aplicación django
httpresponse django example (3)
Estoy escribiendo una prueba de unidad que necesita acceder a un archivo de imagen que coloco en el directorio "fixtures" justo debajo del directorio de mi aplicación django. Quiero abrir este archivo de imagen en mi prueba usando una ruta relativa, lo que me obligaría a obtener la ruta absoluta de la aplicación django. ¿Hay alguna forma de obtener la ruta absoluta de la aplicación django?
Así que la respuesta aceptada generalmente funciona bien. Sin embargo, para
- paquetes de espacio de nombres con múltiples rutas, o
- Aplicaciones que configuran explícitamente sus rutas en la configuración,
su ruta prevista puede no coincidir con el atributo __file__
del módulo.
Django (1.7+) proporciona el atributo AppConfig.path
, que creo que es más claro incluso en casos simples, y que también cubre estos casos de borde.
Los documentos de la aplicación le indican cómo obtener el objeto AppConfig. Así que para obtener AppConfig e imprimir la ruta desde él:
from django.apps import apps
print(apps.get_app_config(''your.app.name'').path)
Normalmente, esto es lo que agrego en mi archivo settings.py para que pueda hacer referencia a la raíz del proyecto.
import os.path
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
Este método obtendrá el directorio de cualquier archivo python.
Los módulos de Python (incluidas las aplicaciones Django) tienen un atributo __file__
que le indica la ubicación de su archivo __init__.py
en el sistema de archivos, por lo que
import appname
pth = os.path.dirname(appname.__file__)
deberías hacer lo que quieras
En circunstancias normales, os.path.absname(appname.__path__[0])
, pero es posible que las aplicaciones lo cambien si quieren importar archivos de forma extraña.
(Siempre hago PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
en mi settings.py
, sin embargo, facilita las diversas configuraciones que deben ser rutas absolutas).