2015-12-10 19 views
51

Pracuję nad projektem, który skanuje skrzynkę pocztową Gmaila użytkownika i dostarcza raport. I wdrożyli go w Heroku z następujących specyfikacji:Nie można zaimportować nazwy _uuid_generate_random w heroku django

Język: Python 2.7

ramowa: Django 1.8

harmonogramu zadań: Seler (RabbitMQ-bigwig dla maklera url)

Teraz, gdy heroku go wykonuje, seler nie daje mi ou tput. Na Heroku popchnij jego wyświetlenie Błąd konfiguracji zbiorczej. Próbowałem przy użyciu pakietu whitenoise

próbowali również wykonanie: Heroku run python manage.py collectstatic --dry prowadzony --noinput Wciąż otrzymuję ten sam błąd.

$ heroku uruchom python manage.py collectstatic --noinput podał następujące szczegóły błędu.

File "manage.py", line 10, in <module> 
execute_from_command_line(sys.argv) 
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line 
utility.execute() 
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 303, in execute 
settings.INSTALLED_APPS 
File "/app/.heroku/python/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in __getattr__ 
self._setup(name) 
File "/app/.heroku/python/lib/python2.7/site-packages/django/conf/__init__.py", line 44, in _setup 
self._wrapped = Settings(settings_module) 
File "/app/.heroku/python/lib/python2.7/site-packages/django/conf/__init__.py", line 92, in __init__ 
mod = importlib.import_module(self.SETTINGS_MODULE) 
File "/app/.heroku/python/lib/python2.7/importlib/__init__.py", line 37, in import_module 
__import__(name) 
File "/app/salesblocker/__init__.py", line 5, in <module> 
from .celery import app as celery_app 
File "/app/salesblocker/celery.py", line 5, in <module> 
from celery import Celery 
File "/app/.heroku/python/lib/python2.7/site-packages/celery/__init__.py", line 131, in <module> 
from celery import five # noqa 
File "/app/.heroku/python/lib/python2.7/site-packages/celery/five.py", line 153, in <module> 
from kombu.utils.compat import OrderedDict # noqa 
File "/app/.heroku/python/lib/python2.7/site-packages/kombu/utils/__init__.py", line 19, in <module> 
from uuid import UUID, uuid4 as _uuid4, _uuid_generate_random 
ImportError: cannot import name _uuid_generate_random 

Próbowałem również do wycofywania Heroku zobowiązać się do poprzedniej pracy popełnić i sklonowano ten kod, ale na następnych commit (zmian: usunięty obraz multimedialny z folderu mediów) pokazując jej ten sam błąd ponownie.

góry dzięki

Odpowiedz

101

Jesteś napotykając this issue, co wpływa Python 2.7.11 (Kombu jest wymagane przez Seler).

Problem został rozwiązany w Kombu 3.0.30.

+1

Domyślnie używana jest najnowsza wersja Kombu, ale ja 'kombu == 3.0.20' w moim pliku wymagań. –

+3

Niestety, wersja 3.0.30 łamie wsteczną zgodność z Django <1.7. – Cerin

+0

@Cerin naprawdę nie powinieneś używać Django <1.8, ponieważ brakuje ci poprawek bezpieczeństwa. Django 1.6 dobiega końca z końcem kwietnia 2015 roku, a Django 1.4 LTS ma koniec życia od października 2015. Jeśli nie możesz uaktualnić do kombu 3.0.30, zastosuj [poprawkę] (https://github.com/ selera/kombu/commit/3f13d9797bc1234e51de98f30e94f511cc21390f # diff-1e972757630e9bd21c157a3e4fdf2e2cL19) do wcześniejszej wersji lub użyj hacka, którą sugeruje mrooney w swojej odpowiedzi. – Alasdair

2

Tak, problem, o którym wspomniał Alasdair, był odpowiedzialny za błąd. Rozwiązałem problem w moim projekcie podążając za this workflow, aby zachować tylko niezbędne wymagania: do zamrożenia.txt, gdzie wymieniam Celery, ale nie jego zależności, takie jak Kombu.

Następnie wystarczy zaktualizować niezbędne pakiety, a następnie ponownie zamrozić pełną listę zależności za pomocą działającej wersji Kombu.

pip install --upgrade -r requirements-to-freeze.txt 
pip freeze > requirements.txt 

i przetestować rzeczy, aby upewnić się, że aktualizacja nie złamać coś innego;)

+0

Jakie są zalety używania 'requirements-to-freeze.txt' przez' install_requires' w 'setup.py'? – Sean

+0

Domyślam się, że możliwe jest również użycie pliku setup.py. Jednak najczęściej nie pakuję aplikacji - po prostu używam plików wymagań, ponieważ Heroku z nimi pracuje. – metakermit

38

Podczas uaktualniania Kombu jest idealnym rozwiązaniem, jeśli utkniesz ze starszymi zależnościami, które nie pozwalają na to, umieszczając to na szczycie mojej settings.py pracował dla mnie:

import uuid 
uuid._uuid_generate_random = None 

to działa, ponieważ _uuid_generate_random usunięto here, a to po prostu przywraca wartość domyślną. Ten hack wydaje się rozsądny, ponieważ Kombu sprawdza to tylko pod work around a bug resolved in 2007, a jeśli potrzebujesz tej poprawki z powodu ostatniej aktualizacji w Pythonie, z natury nie masz na to wpływu :)

+2

To jest oszczędność czasu. Zanim zaktualizuję stary system, muszę go uruchomić ... – zmbq