Model class django.contrib.contenttypes.models.ContentType doesn’t declare an explicit app_label

En voilà un warning pratique à régler encore.

/[...]/python2.7/site-packages/django/contrib/contenttypes/models.py:159: RemovedInDjango19Warning: Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class ContentType(models.Model):

Et si vous utilisez le module auth, voua aurez le droit à ses copines pour les Permission, Group et user.

Bon alors commençons par le début, c’est quoi ce warning, il veut nous dire quoi ?

Si on ouvre le fichier dont on nous parle on tombe la dessus

class ContentType(models.Model):
    app_label = models.CharField(max_length=100)
    model = models.CharField(_('python model class name'), max_length=100)
    objects = ContentTypeManager()
 
    class Meta:
        verbose_name = _('content type')
        verbose_name_plural = _('content types')
        db_table = 'django_content_type'
        unique_together = (('app_label', 'model'),)

Et, Oh magie il n’y a pas de app_label…

Bon, on un début d’explication, mais ce ne devrait pas être un problème vu que cette app django.contrib.contenttypes se trouve bien dans INSTALLED_APP, contrairement à ce qu’il me dit.

Donc je me penche sur la troisième et dernière possibilité que l’on me donne or else was imported before its application was loaded.
Bon, donc en gros, ContentType et compagnie sont chargé avant que mon app le soit, mais comment est-ce possible ?

Pour savoir ou c’est chargé, je vais lancer runserver avec l’option -Werror, et récupérer une traceback qui me donnera plus d’infos

$ python -Werror manage.py runserver                                                                                                                                                                       
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 351, in execute_from_command_line
    utility.execute()
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 303, in execute
    settings.INSTALLED_APPS
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in __getattr__
    self._setup(name)
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 44, in _setup
    self._wrapped = Settings(settings_module)
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 92, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/Aymeric/Projects/www/klemail/__init__.py", line 5, in <module>
    from .celery import app as celery_app
  File "/home/Aymeric/Projects/www/klemail/celery.py", line 5, in <module>
    from celery import Celery
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/celery/five.py", line 306, in __getattr__
    module = __import__(self._object_origins[name], None, None, [name])
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/celery/app/__init__.py", line 14, in <module>
    from celery import _state
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/celery/_state.py", line 20, in <module>
    from celery.utils.threads import LocalStack
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/celery/utils/__init__.py", line 25, in <module>
    from kombu.entity import Exchange, Queue
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/kombu/entity.py", line 10, in <module>
    from .abstract import MaybeChannelBound, Object
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/kombu/abstract.py", line 12, in <module>
    from .connection import maybe_channel
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/kombu/connection.py", line 19, in <module>
    from kombu import exceptions
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/kombu/exceptions.py", line 12, in <module>
    from amqp import ChannelError, ConnectionError, ResourceError
  File "/home/Aymeric/Projects/Klemail/www/venv/lib/python2.7/site-packages/amqp/__init__.py", line 34, in <module>
    from .connection import Connection      # noqa
  File "/home/Aymeric/Projects/www/venv/lib/python2.7/site-packages/amqp/connection.py", line 24, in <module>
    from ssl import SSLError
ImportWarning: Not importing directory '/home/Aymeric/Projects/www/ssl': missing __init__.py

Bon la, je suis perdu, en fin de compte le problème viendrait de Celery que j’import dans mon __init__.py de mon projet. Je le commente pour voir ce que ça donne.

Mais ce coups-ci je lance la commande makemigrations parceque runserver va planter et me donner une erreur qui me fait pas avancer. Je tente donc la commande makemigrations.

Et la en regardant la traceback, on y est !. Je vais pas vous la copier en entier parcequ’elle est longue, mais une ligne m’interpelle :

File "/home/Aymeric/Projects/www/libs/log.py", line 4, in <module>

En faite dans ce fichier je définis un nouvel Handler pour le loggings (pour logger sur slack). Et comme pour envoyer des messages sur Slack, je charger Celery qui lui doit charger ContentType, le tout avant que mon programme soit chargé, j’ai ma solution !

Pour tester, je remet en état initial mon fichier __init__.py, et je commente toute la partie qui implique l’import de Celery dans mon fichier logs.py

Plus de warning, YOUHOU

Bon, bah maintenant que j’ai trouvé d’où ca vient, je retourne finir de fixer cetter merde 😉

Aymeric DERBOIS

J'ai 27 ans et je suis développeur. Je travail la plupart du temps sur des techno web, mais pas que. Étant à l'affût des nouveautés, j'adore découvrir tout et n'importe quoi dans l'informatique. Je suis amoureux de CakePHP et j'utilise au quotidien Django. Je suis très ouvert d'esprit :). J'aime bien utiliser AngularJS aussi de temps à autre pour faire du front. Au quotidien j'utilise Fedora/Ubuntu pour le desktop et CentOS pour mes serveurs. Par ailleurs je maîtrise le C/C++/Python/PHP/...

More Posts - Website

Follow Me:
Twitter

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.