Pregunta

Estoy muy confundido por algunos errores que estoy recibiendo lo que estoy tratando de poner una aplicación en producción. Todo funciona bien en el equipo de desarrollo, pero no puedo syncdb o penetrar en el depósito de Django en el servidor de producción. Estoy consiguiendo un error cuando es forum.models.py intentos de importar forum.managers.py porque los modelos no están en el espacio de nombres todavía.

Creo que podría ser un problema PYTHONPATH, pero tiene un aspecto Pollo o huevo extraño a ella. No entiendo por qué TagManager no está en el espacio de nombres.
TagManager se importa a través:
forum.managers de import *
El cual se ejecuta antes de la la clase TagManager se llama.

$ python2.5 manage.py syncdb
Rastreo (llamada más reciente pasado):
  Archivo "manage.py", línea 11, en
    execute_manager (configuración)
  Archivo "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/init.py", línea 362, en execute_manager
    utility.execute ()
  Archivo "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/init.py", línea 303, en ejecutar
    self.fetch_command (subcomando) .run_from_argv (self.argv)
  Archivo "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", la línea 195, en run_from_argv
    self.execute (* args, ** opciones. dict )
  Archivo "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", línea 221, en ejecutar
    self.validate ()
  Archivo "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", línea 249, en validate
    NUM_ERRORS = get_validation_errors (s, app)
  Archivo "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/validation.py", línea 28, en get_validation_errors
    para (nombre_apl, error) en get_app_errors () artículos ():.
  Archivo "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", línea 131, en get_app_errors
    self._populate ()
  Archivo "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", línea 58, en _populate
    self.load_app (nombre_apl, True)
  Archivo "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", la línea 74, en load_app
    modelos import_module = ('. modelos, nombre_apl)
  Archivo "/home/app_name/webapps/app_name/lib/python2.5/django/utils/importlib.py", línea 35, en import_module
     Importar (nombre)
  Archivo "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", línea 18, en
    forum.managers de import *
  Archivo "/home/app_name/webapps/app_name/django_app/forum/managers.py", línea 6, en
    forum.models de import *
  Archivo "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", línea 43, en
    clase Tag (models.Model):
  Archivo "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", línea 53, en la etiqueta
    objetos = TagManager ()
NameError: nombre 'TagManager' no está definido

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>  
>>>   
¿Fue útil?

Solución

Su problema es que debes hacer:

desde forum.managers import * (en la línea 18 models.py) de forum.models import * (en la línea 6 managers.py)

¿Cómo puede trabajar siempre? Intenta aplanamiento esto (hacer las importaciones por la copia mano y pegar en un nuevo archivo) y verá por qué, en el momento en que se ejecuta la línea "objetos = TagManager ()" no es posible que haya hecho la parte del módulo de administradores donde se define TagManager, a menos que se definió antes de la línea 18.

Algunos consejos generales:

  1. Evite las importaciones * siempre que sea posible (que hace que los programas de pitón más difícil de leer si no otra cosa)
  2. Si tiene importaciones circulares así, tratar de separarlos. A menudo, en un módulo puede mover la importación en una llamada de función, o puede refactorizar algunos elementos en un tercer módulo que ambos pueden importar. También puede probar a mover la importación inferior en el módulo, que a veces funciona.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top