question PYTHONPATH sur un serveur de production et de défi Namespace
-
20-09-2019 - |
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>
>>>
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:
- Évitez les importations * chaque fois que possible (il rend les programmes de python plus difficile à lire si rien d'autre)
- 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.