es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Django AppConfig ready() Django AppConfig listo()

Tengo Django 2.1.7.

He leído la documentación de Django, así como esto https://stackoverflow.com/questions/59225246/how-to-use-django-appconfig-ready?noredirect=1&lq=1 y esto https://stackoverflow.com/questions/37429726/overriding-appconfig-ready.

Ahora, la estructura de carpetas/archivos es así,

my_app
 __init__.py
 urls.py
 sub_app1
  migrations
  __init__.py
  admin.py
  apps.py
  models.py
  ...
 sub_app2
  ...
 sub_app3
  ...

y todas las sub_apps se registran en INSTALLED_APPS del archivo settings.py de Django como my_app.sub_app1, por ejemplo. Me di cuenta de que cuando intento sobrescribir ready() para sub_app1 en sub_app1.apps.py, la sobrescritura no tiene efecto.

Cuando aplano mi estructura anterior como

my_app
 __init__.py
 urls.py
 apps.py

la sobrescritura de ready funciona bien.

En otras palabras, parece que la sobrescritura de ready de una subaplicación dentro del archivo apps.py de la subaplicación no funciona.

Además, ya sea que use default_app_config dentro de __init__.py de la subaplicación o my_app.sub_app1.apps.SubApp1Config dentro de settings.py INSTALLED_APPS, da error django.core.exceptions.ImproperlyConfigured: Cannot import 'sub_app1'. Check that 'my_app.sub_app1.apps.SubApp1Config.name' is correct.

¿Por qué está ocurriendo esto?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con anular el método ready() dentro del archivo apps.py de una subaplicación se debe a la forma en que Django importa e inicializa las aplicaciones. Cuando un proyecto que utiliza Django se inicia, importa todas las aplicaciones que se enumeran en settings.py e las inicializa. Este proceso de inicialización pasa por la subclase AppConfig de cada aplicación, que es responsable de tareas como inicializar señales y conectarse a la base de datos.

    Cuando una subaplicación se lista como my_app.sub_app1 en INSTALLED_APPS, Django espera encontrar su subclase AppConfig en my_app.sub_app1.apps. Sin embargo, si el archivo apps.py se encuentra en el directorio de la subaplicación (my_app.sub_app1), no será encontrado por el mecanismo de importación. En su lugar, se utilizará la subclase AppConfig definida en my_app.apps (el apps.py de nivel de proyecto), que no tiene la anulación de ready() definida para sub_app1.

    Para solucionar este problema, una solución es mover el archivo apps.py al directorio de la aplicación principal (my_app). De esta manera, la subclase AppConfig definida en my_app.sub_app1.apps será encontrada y utilizada durante la inicialización, lo que permitirá que la anulación de ready() surta efecto.

    El error con default_app_config y my_app.sub_app1.apps.SubApp1Config que no se reconocen como opciones de configuración válidas en settings.py probablemente también esté relacionado con el problema mencionado anteriormente. Si la subclase AppConfig de una subaplicación no se encuentra durante la inicialización, cualquier intento de hacer referencia a ella en otro lugar (como con default_app_config o la cadena de importación completa en INSTALLED_APPS) fallará.

Comments are closed.