2013-07-30 35 views
1

我正在嘗試將django-芹菜集成到現有的網站中,並且我遇到了一個我似乎無法修復的錯誤。嘗試運行django-芹菜工作進程時生成的ImportError

對於上下文,我通過了Django first steps並且測試項目成功了,也就是說一切都按照它應該的那樣工作。現在

,在我現有的項目,我不能在命令行運行芹菜工作人員:

manage.py celery worker --loglevel=info --settings=myproject.settings.dev_settings 

當我跑,我得到了下面的堆棧跟蹤和錯誤:

Traceback (most recent call last): 
    File "C:\sites\corecrm\manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 453, in execute_from_command_line 
    utility.execute() 
    File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 392, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "C:\Python27\lib\site-packages\djcelery\management\commands\celery.py", line 22, in run_from_argv 
    ['%s %s' % (argv[0], argv[1])] + argv[2:], 
    File "C:\Python27\lib\site-packages\celery\bin\celery.py", line 901, in execute_from_commandline 
    super(CeleryCommand, self).execute_from_commandline(argv))) 
    File "C:\Python27\lib\site-packages\celery\bin\base.py", line 187, in execute_from_commandline 
    return self.handle_argv(prog_name, argv[1:]) 
    File "C:\Python27\lib\site-packages\celery\bin\celery.py", line 893, in handle_argv 
    return self.execute(command, argv) 
    File "C:\Python27\lib\site-packages\celery\bin\celery.py", line 868, in execute 
    return cls(app=self.app).run_from_argv(self.prog_name, argv) 
    File "C:\Python27\lib\site-packages\celery\bin\celery.py", line 148, in run_from_argv 
    return self(*args, **options) 
    File "C:\Python27\lib\site-packages\celery\bin\celery.py", line 118, in __call__ 
    ret = self.run(*args, **kwargs) 
    File "C:\Python27\lib\site-packages\celery\bin\celery.py", line 220, in run 
    return self.target.run(*args, **kwargs) 
    File "C:\Python27\lib\site-packages\celery\bin\celeryd.py", line 153, in run 
    return self.app.Worker(**kwargs).run() 
    File "C:\Python27\lib\site-packages\celery\apps\worker.py", line 162, in run 
    self.app.loader.init_worker() 
    File "C:\Python27\lib\site-packages\celery\loaders\base.py", line 130, in init_worker 
    self.import_default_modules() 
    File "C:\Python27\lib\site-packages\djcelery\loaders.py", line 138, in import_default_modules 
    self.autodiscover() 
    File "C:\Python27\lib\site-packages\djcelery\loaders.py", line 141, in autodiscover 
    self.task_modules.update(mod.__name__ for mod in autodiscover() or()) 
    File "C:\Python27\lib\site-packages\djcelery\loaders.py", line 176, in autodiscover 
    for app in settings.INSTALLED_APPS]) 
    File "C:\Python27\lib\site-packages\djcelery\loaders.py", line 195, in find_related_module 
    return importlib.import_module('%s.%s' % (app, related_name)) 
    File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module 
    __import__(name) 
    File "C:\sites\corecrm\people\tasks.py", line 15, in <module> 
    from people.models import Customer, CustomerCsvFile, CustomerToTag, get_customer_from_csv_row 
    File "C:\sites\corecrm\people\models.py", line 163, in <module> 
    UserProfile._meta.get_field_by_name('username')[0]._max_length = 75 
    File "C:\Python27\lib\site-packages\django\db\models\options.py", line 351, in get_field_by_name 
    cache = self.init_name_map() 
    File "C:\Python27\lib\site-packages\django\db\models\options.py", line 380, in init_name_map 
    for f, model in self.get_all_related_m2m_objects_with_model(): 
    File "C:\Python27\lib\site-packages\django\db\models\options.py", line 469, in get_all_related_m2m_objects_with_model 
    cache = self._fill_related_many_to_many_cache() 
    File "C:\Python27\lib\site-packages\django\db\models\options.py", line 483, in _fill_related_many_to_many_cache 
    for klass in get_models(only_installed=False): 
    File "C:\Python27\lib\site-packages\django\db\models\loading.py", line 197, in get_models 
    self._populate() 
    File "C:\Python27\lib\site-packages\django\db\models\loading.py", line 75, in _populate 
    self.load_app(app_name) 
    File "C:\Python27\lib\site-packages\django\db\models\loading.py", line 96, in load_app 
    models = import_module('.models', app_name) 
    File "C:\Python27\lib\site-packages\django\utils\importlib.py", line 35, in import_module 
    __import__(name) 
    File "C:\sites\corecrm\booking\models.py", line 17, in <module> 
    from people.models import Customer, UserProfile 
ImportError: cannot import name Customer 

要嘗試找出預訂/ models.py腳本看到了什麼的人加入我在開始執行以下操作:

import people 
print 'path: %s' % people.__path__ 
for item in dir(people): 
    print item 

這給了我下面的輸出:

path: ['C:\\sites\\corecrm\\people'] 
__builtins__ 
__doc__ 
__file__ 
__name__ 
__package__ 
__path__ 
path: ['C:\\sites\\corecrm\\people'] 
__builtins__ 
__doc__ 
__file__ 
__name__ 
__package__ 
__path__ 
然而

,當我運行manage.py shell --settings=myproject.settings.dev_settings我得到以下的輸出:

path: ['C:\\sites\\corecrm\\people'] 
__builtins__ 
__doc__ 
__file__ 
__name__ 
__package__ 
__path__ 
path: ['C:\\sites\\corecrm\\people'] 
__builtins__ 
__doc__ 
__file__ 
__name__ 
__package__ 
__path__ 
models 

正如你可以看到models模塊可在的結束shell命令的第二個列表(我已經證實這也是對於芹菜以外的manage.py命令的情況)。當我運行celery命令時,如何確保該模塊在同一點上可用?

編輯:我現在還在Ubuntu VM上設置了這個項目,當我嘗試運行worker管理命令時出現同樣的錯誤。有任何想法嗎?任何人?

ANOTHER編輯:我已經貼訂票/ models.py和人/ models.py代碼在http://pastebin.com/fTVVBtB4

+0

Aren'you失蹤「__init__.py」(init之前和之後的雙下劃線)文件在people /目錄中告訴Python它是一個包? – Ricola3D

+0

如果沒有'__init __。py',它就根本不存在__init __。py' – Glycerine

+0

@ Ricola3D:不,'__init __。py'文件存在,否則嘗試運行shell管理命令(或任何其他命令)將不起作用。另外,人員應用程序是使用'manage.py startapp people'創建的,它可以自動將'__init __。py'放入目錄 – hellsgate

回答

1

我敢肯定,這條線是你的問題:

File "C:\sites\corecrm\people\models.py", line 163, in <module> 
    UserProfile._meta.get_field_by_name('username')[0]._max_length = 75 

雖然您仍然忙於從people.models導入,此行(特別是get_field_by_name)強制Django評估模型並設置該模型與其相關模型之間的所有關係。這反過來又會強制在people.models中輸入Customer,而您仍然忙於導入該確切模型。這是ImportError的結果。

對於工作解決方案,您需要發佈models.py。

爲什麼這個錯誤只發生在芹菜?我不能肯定地說沒有更多的信息,但我最好的猜測是,芹菜處理導入一切略有不同(Django可能不會一次導入Customer,CustomerCsvFile,CustomerToTagget_customer_from_csv_row),並且這暴露了您的錯誤碼。

編輯/解決方案:
我會刪除此行:

UserProfile._meta.get_field_by_name('username')[0]._max_length = 75 

,並將其移動到實例的層次,進入__init__方法:

class UserProfile(AbstractUser): 
    def __init__(self, *args, **kwargs): 
     self._meta.get_field_by_name('username')[0]._max_length = 75 
     super(UserProfile, self).__init__(*args, **kwargs) 

如果該問題的原因是實際上我認爲它是這樣的,這將在提供相同功能的同時修復循環導入。如果MAX_LENGTH功能得到打破以某種方式(最有可能是因爲內部一個MAX_LENGTH校驗器被添加到CharField和_max_length改變太晚了)我想,而不是覆蓋在init方法的完整username領域:

class UserProfile(AbstractUser): 
    def __init__(self, *args, **kwargs): 
     super(UserProfile, self).__init__(*args, **kwargs) 
     self._meta.get_field_by_name('username')[0] = models.CharField(max_length=75, etc.) 
+0

我已經發布了一個代碼鏈接,而不是將其添加到這個問題因爲它相當大 – hellsgate

+0

@hellsgate我已經用解決方案更新了我的答案。 – knbk

+0

完美,工人現在按預期運行。謝謝! – hellsgate