سؤال

أنا مرتبك حقًا من خلال بعض الأخطاء التي أحصل عليها وأنا أحاول وضع تطبيق في الإنتاج. كل شيء يعمل بشكل جيد على آلة التطوير ، لكن لا يمكنني مزامنة أو إدخال قذيفة Django على خادم الإنتاج. أحصل على خطأ عندما يكون forum.models.py محاولات لاستيراد forum.managers.py لأن النماذج ليست في مساحة الاسم حتى الآن.

أعتقد أنه يمكن أن يكون مشكلة بيثون ، ولكن لديها جانب دجاج أو بيضة غريب. لا أفهم لماذا لا يكون Tagmanager في مساحة الاسم.
يتم استيراد Tagmanager عبر:
من المنتدى.
الذي يتم تنفيذه قبل أن يسمى فئة Tagmanager.

$ python2.5 manage.py syncdb
Traceback (أحدث مكالمة أخيرة):
ملف "manage.py" ، السطر 11 ، في
execute_manager (الإعدادات)
ملف "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/فيه.py "، السطر 362 ، في execute_manager
footility.execute ()
ملف "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/فيه.py "، السطر 303 ، في التنفيذ
self.fetch_command (المفتاح الفرعي) .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 ، ** خيارات.قاموس)
ملف "/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 ، في التحقق من صحة
num_errors = get_validation_errors (s ، التطبيق)
ملف "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/validation.py" ، السطر 28 ، في get_validation_errors
لـ (app_name ، خطأ) في get_app_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
النماذج = import_module ('. النماذج' ، app_name)
ملف "/home/app_name/webapps/app_name/lib/python2.5/django/utils/importlib.py
يستورد(اسم)
ملف "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py" ، السطر 18 ، في
من المنتدى.
ملف "/home/app_name/webapps/app_name/django_app/forum/managers.py" ، السطر 6 ، في
من Forum.Models استيراد *
ملف "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py" ، السطر 43 ، في
علامة الفئة (models.model):
ملف "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py" ، السطر 53 ، في علامة
الكائنات = tagmanager ()
NameError: اسم "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>  
>>>   
هل كانت مفيدة؟

المحلول

مشكلتك هي أنك تفعل:

من Forum.Managers استيراد * (في السطر 18 موديلات) من Forum.Models استيراد * (في السطر 6 مديرين)

كيف يمكن أن يعمل هذا من أي وقت مضى؟ حاول تسطيح هذا الأمر (قم بالواردات عن طريق النسخ اليدوي واللصق في ملف جديد) وسترى لماذا ، بحلول الوقت الذي ينفذ فيه السطر "الكائنات = tagManager ()" لا يمكن أن ينفذ جزء من وحدة المديرين حيث يتم تعريف tagmanager ، ما لم يتم تعريفه قبل السطر 18.

بعض النصائح العامة:

  1. تجنب الواردات * كلما كان ذلك ممكنًا (يجعل برامج Python أكثر صعوبة في قراءة إذا لم يكن هناك شيء آخر)
  2. إذا كان لديك واردات دائرية من هذا القبيل ، فحاول تفكيكها. في كثير من الأحيان في وحدة واحدة ، يمكنك نقل الاستيراد إلى مكالمة دالة ، أو يمكنك إعادة تشكيل بعض العناصر في وحدة ثالثة يمكن أن تستورد منها كلاهما. يمكنك أيضًا محاولة تحريك الاستيراد أقل في الوحدة النمطية ، والتي تعمل في بعض الأحيان.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top