Question

Je suis vraiment confus par quelques erreurs que je reçois comme je suis en train de mettre une application en production. Tout fonctionne très bien sur la machine de développement, mais je ne peux pas syncdb ou entrer dans le shell Django sur le serveur de production. Je reçois une erreur lorsque forum.models.py est tentatives d'importation forum.managers.py parce que les modèles ne sont pas dans l'espace de noms encore.

Je pense qu'il pourrait être un problème PYTHONPATH, mais il a un aspect de poulet ou oeuf étrange à elle. Je ne comprends pas pourquoi TagManager est pas dans le namespace.
TagManager est importée via:
de forum.managers import *
Ce qui est exécuté avant la classe de TagManager est appelée.

$ python2.5 manage.py syncdb
Retraçage (appel le plus récent en dernier):
  Fichier "manage.py", ligne 11,
    execute_manager (paramètres)
  Fichier "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/init.py", ligne 362, en execute_manager
    utility.execute ()
  Fichier "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/init.py", ligne 303, en exécution
    self.fetch_command (sous-commande) .run_from_argv (self.argv)
  Fichier "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", ligne 195, en run_from_argv
    self.execute (* args, ** options. dict )
  Fichier "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", ligne 221, en exécution
    self.validate ()
  Fichier "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", ligne 249, en validate
    NUM_ERRORS = get_validation_errors (s, app)
  Fichier "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/validation.py", ligne 28, en get_validation_errors
    pour (app_name, erreur) dans get_app_errors () articles ():.
  Fichier "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", ligne 131, en get_app_errors
    self._populate ()
  Fichier "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", ligne 58, en _populate
    self.load_app (app_name, True)
  Fichier "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", ligne 74, en load_app
    modèles = import_module ( ». modèles, app_name)
  Fichier "/home/app_name/webapps/app_name/lib/python2.5/django/utils/importlib.py", ligne 35, en import_module
     import (nom)
  Fichier "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", ligne 18,
    de forum.managers import *
  Fichier "/home/app_name/webapps/app_name/django_app/forum/managers.py", ligne 6,
    de forum.models import *
  Fichier "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", ligne 43,
    classe Tag (models.Model):
  Fichier "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", ligne 53, en Tag
    objets = TagManager ()
NameError: nom 'TagManager' est pas défini

Python 2.5.4 (r254:67916, Aug  5 2009, 12:42:40)   
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2  
Type "help", "copyright", "credits" or "license" for more information.  
>>> import os  
>>> os.environ['DJANGO_SETTINGS_MODULE'] = 'django_app.settings'  
>>>   
>>> import sys  
>>> import pprint  
>>> pprint.pprint(sys.path)  
['',  
 '/home/app_name/webapps/app_name/lib/python2.5',  
 '/home/app_name/lib/python2.5/markdown2-1.0.1.16-py2.5.egg',  
 '/home/app_name/lib/python2.5/html5lib-0.11.1-py2.5.egg',  
 '/home/app_name/lib/python2.5',  
 '/usr/local/lib/python25.zip',  
 '/usr/local/lib/python2.5',  
 '/usr/local/lib/python2.5/plat-linux2',  
 '/usr/local/lib/python2.5/lib-tk',  
 '/usr/local/lib/python2.5/lib-dynload',  
 '/usr/local/lib/python2.5/site-packages',  
 '/usr/local/lib/python2.5/site-packages/PIL']  
>>> sys.path = ['/home/app_name/webapps/app_name/django_app','/home/app_name/webapps/app_name','/home/app_name/webapps/app_name/lib/python2.5'] + sys.path  
>>> pprint.pprint(sys.path)['/home/app_name/webapps/app_name/django_app',  
 '/home/app_name/webapps/app_name',  
 '/home/app_name/webapps/app_name/lib/python2.5',  
 '',  
 '/home/app_name/webapps/app_name/lib/python2.5',  
 '/home/app_name/lib/python2.5/markdown2-1.0.1.16-py2.5.egg',  
 '/home/app_name/lib/python2.5/html5lib-0.11.1-py2.5.egg',  
 '/home/app_name/lib/python2.5',  
 '/usr/local/lib/python25.zip',  
 '/usr/local/lib/python2.5',  
 '/usr/local/lib/python2.5/plat-linux2',  
 '/usr/local/lib/python2.5/lib-tk',  
 '/usr/local/lib/python2.5/lib-dynload',  
 '/usr/local/lib/python2.5/site-packages',  
 '/usr/local/lib/python2.5/site-packages/PIL']  
>>> from forum.managers import *  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
  File "/home/app_name/webapps/app_name/django_app/forum/managers.py", line 6, in <module>  
    from forum.models import *  
  File "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", line 43, in <module>  
    class Tag(models.Model):  
  File "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", line 53, in Tag  
    objects = TagManager()  
NameError: name 'TagManager' is not defined  
>>> from forum.models import *  
>>> from forum.managers import *  
>>> objects = TagManager()  
>>> objects  
<forum.managers.TagManager object at 0x9b9fdac>  
>>>   
Était-ce utile?

La solution

Votre problème est que vous faites:

de forum.managers import * (à la ligne 18 models.py) de forum.models import * (à la ligne 6 managers.py)

Comment cela peut-il fonctionner? Essayez aplatir ceci (faire les importations à la main copier et coller dans un nouveau fichier) et vous comprendrez pourquoi, au moment où il exécute la ligne « objets = TagManager () » il ne peut peut-être avoir exécuté la partie du module de gestionnaires où TagManager est défini, sauf qu'il a été défini, avant la ligne 18.

Quelques conseils généraux:

  1. Évitez les importations * chaque fois que possible (il rend les programmes de python plus difficile à lire si rien d'autre)
  2. Si vous avez des importations circulaires comme ça, essayez de les briser. Souvent, dans un module, vous pouvez déplacer l'importation dans un appel de fonction, ou vous pouvez factoriser certains éléments dans un troisième module que les deux peuvent importer. Vous pouvez également essayer de déplacer l'importation plus bas dans le module, qui fonctionne parfois.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top