0

アプリを本番環境にしようとしているときに発生するいくつかのエラーに本当に混乱しています。開発マシンではすべて正常に動作しますが、本番サーバーで syncdb を実行したり、Django シェルに入ることができません。モデルがまだ名前空間にないため、forum.models.py が forum.managers.py をインポートしようとするとエラーが発生します。

PYTHONPATH の問題である可能性があると思いますが、奇妙なニワトリまたはエッグの側面があります。TagManager が NameSpace にない理由がわかりません。
TagManager は次の方法でインポートされます:
from forum.managers import *
TagManager クラスが呼び出される前に実行されます。

$ python2.5 manage.py syncdb
トレースバック (最新の呼び出しが最後):
ファイル "manage.py"、11 行目、
execute_manager(settings)
ファイル "/home/app_name/webapps/app_name/lib/python2.5/django/ core/management/ init .py」、362 行目、execute_manager
utility.execute()
ファイル内「/home/app_name/webapps/app_name/lib/python2.5/django/core/management/init .py」、303 行目、 in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
ファイル "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py"、195 行目、run_from_argv
self 内。 execute(*args, ** options.dict )
ファイル "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py" の 221 行目、
self.validate()の実行
ファイル "/home/app_name/webapps/app_name/lib /python2.5/django/core/management/base.py"、249 行目、validate
num_errors = get_validation_errors(s, app)
File "/home/app_name/webapps/app_name/lib/python2.5/django/core/ management/validation.py"、28 行
目、get_app_errors().items() の (app_name, error) の get_validation_errors:
ファイル "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/ loading.py"、131 行目、get_app_errors
self._populate()
ファイル "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py"、58 行目、_populate 内
self.load_app(app_name, True)
ファイル "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py"、74 行目、load_app
models = import_module('.models', app_name)
ファイル "/home/app_name/webapps/app_name/lib/python2.5/django/utils/importlib.py"、35 行目、import_module
インポート(名前)
ファイル "/home/app_name/webapps/app_name/django_app/ ../django_app/forum/models.py", line 18,
from from forum.managers import *
ファイル "/home/app_name/webapps/app_name/django_app/forum/managers.py", line 6,
from forum.models import *
ファイル "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py"、43 行目、
クラス Tag(models.モデル):
ファイル "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py"、53 行目、タグ
オブジェクト = TagManager()
NameError: name 'TagManager' が定義されていません

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>  
>>>   
4

1 に答える 1

1

あなたの問題はあなたがすることです:

from forum.managers import * (18行目のmodels.py) from forum.models import * (6行目のmanagers.py)

それはどのように機能しますか?これをフラット化してみてください (手動でコピーして新しいファイルに貼り付けることでインポートを行います)。なぜなら、「objects = TagManager()」という行を実行するまでに、managers モジュールの一部を実行できなかった可能性があることがわかります。ここで、18 行目より前に定義されていない限り、TagManager が定義されます。

一般的なヒント:

  1. * のインポートは可能な限り避けてください (そうすると Python プログラムが読みにくくなります)
  2. そのような循環インポートがある場合は、それらを分割してみてください。多くの場合、1 つのモジュールでインポートを関数呼び出しに移動したり、いくつかの要素をリファクタリングして、両方からインポートできる 3 番目のモジュールにすることができます。モジュール内でインポートを下に移動することもできますが、これはうまくいく場合があります。
于 2010-01-14T20:42:41.963 に答える