Pergunta

Estou realmente confuso com alguns erros que estou recebendo enquanto estou tentando colocar um aplicativo em produção. Tudo funciona bem na máquina de desenvolvimento, mas não posso sincronizar ou entrar no shell do Django no servidor de produção. Estou recebendo um erro quando o forum.models.py é tentativa de importar forum.managers.py porque os modelos ainda não estão no espaço para nome.

Eu acho que poderia ser um problema de pythonpath, mas tem um aspecto estranho de frango ou ovo. Não entendo por que o TagManager não está no espaço para nome.
TagManager é importado via:
de fórum.Managers Import *
Que é executado antes que a classe TagManager seja chamada.

$ python2.5 gerencia.py syncdb
Traceback (chamada mais recente):
Arquivo "Manage.py", linha 11, em
Execute_manager (Configurações)
Arquivo "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/iniciar.py ", linha 362, em execute_manager
utilitário.Execute ()
Arquivo "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/iniciar.py ", linha 303, em execução
Self.Fetch_Command (Subcomando) .run_from_argv (self.argv)
Arquivo "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", linha 195, em run_from_argv
self.execute (*args, ** opções.dicto)
Arquivo "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", linha 221, em execução
self.validate ()
Arquivo "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", linha 249, no Validate
num_errors = get_validation_errors (s, app)
Arquivo "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/validation.py", linha 28, em get_validation_errors
para (app_name, erro) em get_app_errors (). itens ():
Arquivo "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", linha 131, em get_app_errors
self._populate ()
Arquivo "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", linha 58, em _populate
self.load_app (app_name, true)
Arquivo "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", linha 74, em load_app
modelos = import_module ('. modelos', app_name)
Arquivo "/home/app_name/webapps/app_name/lib/python2.5/django/utils/importlib.py", linha 35, em import_module
importar(nome)
Arquivo "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", linha 18, em
de fórum.Managers Import *
Arquivo "/home/app_name/webapps/app_name/django_app/forum/managers.py", linha 6, em
de fórum.Models Import *
Arquivo "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", linha 43, em
tag de classe (models.model):
Arquivo "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", linha 53, na tag
Objetos = TagManager ()
NomeError: Nome 'TagManager' não 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>  
>>>   
Foi útil?

Solução

Seu problema é que você faz:

do fórum.Managers Import * (na linha 18 modelos.py) do forum.models importar * (na linha 6 gerentes.py)

Como isso pode funcionar? Tente achatar isso (faça as importações, copiando e colando um novo arquivo) e você verá por que, quando ele executar a linha "Objects = tagManager ()" Não pode ter executado a parte do módulo de gerentes onde o TagManager é definido, a menos que tenha sido definido antes da linha 18.

Algumas dicas gerais:

  1. Evite as * importações sempre que possível (torna os programas Python mais difíceis de ler, se nada mais)
  2. Se você tem importações circulares como essa, tente quebrá -las. Muitas vezes, em um módulo, você pode mover a importação para uma chamada de função ou pode refatorar alguns elementos em um terceiro módulo do qual ambos podem importar. Você também pode tentar mover a importação mais baixa no módulo, que às vezes funciona.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top