Frage

Ich bin von einigen Fehlern wirklich verwirrt Ich erhalte als ich versuche, eine App in Produktion zu setzen. Alles funktioniert gut auf der Entwicklung Maschine, aber ich kann den Django-Shell auf dem Produktionsserver nicht syncdb oder eingeben. Ich erhalte eine Fehlermeldung, wenn forum.models.py Versuche, Import forum.managers.py ist, weil die Modelle noch nicht im Namensraum sind.

Ich denke, es ist ein PYTHONPATH Problem sein könnte, aber es hat eine seltsame Huhn oder Ei Aspekt. Ich verstehe nicht, warum TagManager nicht im Namensraum ist.
TagManager importiert über:
von forum.managers importieren *
Welche wird, bevor die die TagManager Klasse ausgeführt wird aufgerufen.

$ python2.5 manage.py syncdb
Traceback (jüngste Aufforderung zuletzt):
  File "manage.py", Zeile 11, in
    execute_manager (Einstellungen)
  File "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/init.py", Zeile 362, in execute_manager
    utility.execute ()
  File "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/init.py", Zeile 303, in ausführen
    self.fetch_command (subcommand) .run_from_argv (self.argv)
  File "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", Linie 195, in run_from_argv
    self.execute (* args, ** Optionen. dict )
  File "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", Zeile 221, in ausführen
    self.validate ()
  File "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", Zeile 249, in validate
    NUM_ERRORS = get_validation_errors (s, app)
  File "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/validation.py", Zeile 28, in get_validation_errors
    für (app_name, Fehler) in get_app_errors () Produkte ():.
  File "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", Linie 131, in get_app_errors
    self._populate ()
  File "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", Zeile 58, in _populate
    self.load_app (app_name, True)
  File "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", Zeile 74, in load_app
    Modelle = import_module (‘. Modelle, app_name)
  File "/home/app_name/webapps/app_name/lib/python2.5/django/utils/importlib.py", Zeile 35, in import_module
     Import (Name)
  File "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", Zeile 18, in
    von forum.managers importieren *
  File "/home/app_name/webapps/app_name/django_app/forum/managers.py", Zeile 6, in
    von forum.models importieren *
  File "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", Zeile 43, in
    Klasse-Tag (models.Model):
  File "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", Zeile 53, in Tag
    Objekte = TagManager ()
Nameerror: name 'TagManager' ist nicht definiert

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>  
>>>   
War es hilfreich?

Lösung

Ihr Problem ist, dass Sie tun:

von forum.managers * importieren (in Zeile 18 models.py) von forum.models importieren * (in Zeile 6 managers.py)

Wie kann das überhaupt funktionieren? Versuchen Sie, diese aus Abflachung (tun die Importe von Hand Kopieren und Einfügen in eine neue Datei), und Sie werden sehen, warum, von der Zeit, die die Linie führt „Objekte = TagManager ()“ es unmöglich ausgeführt haben, können den Teil des Manager-Modul wo TagManager definiert ist, sofern sie nicht vorher Linie 18 definiert wurde.

Einige allgemeine Tipps:

  1. Vermeiden Sie die * Importe, wann immer möglich (es Python-Programme erschwert, wenn nichts anderes lesen)
  2. Wenn Sie Kreis Importe so haben, versuchen, sie zu brechen. Oft in einem Modul können Sie den Import in einen Funktionsaufruf bewegen, oder Sie können einige Elemente in ein drittes Modul Refactoring, dass sowohl aus importieren. Sie können auch versuchen, den Import niedriger im Modul bewegt, die manchmal funktioniert.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top