2014-04-05 3 views
1

Я использую Django 1.6 и Django-ImageKit 3.2.1.ImageKit async error - невозможно декодировать тело сообщения

Я пытаюсь генерировать изображения асинхронно с ImageKit. Асинхронное создание изображений работает локально, но не на рабочем сервере.

Я использую сельдерей, и я попытался как:

IMAGEKIT_DEFAULT_CACHEFILE_BACKEND = 'imagekit.cachefiles.backends.Async'

IMAGEKIT_DEFAULT_CACHEFILE_BACKEND = 'imagekit.cachefiles.backends.Celery'

Использование Simple бэкэнд (синхронно) вместо Async или Celery отлично работает на сервере. Так что я не понимаю, почему асинхронная бэкенд дает мне ImportError (вытянуто из журнала сельдерея):

[2014-04-05 21:51:26,325: CRITICAL/MainProcess] Can't decode message body: DecodeError(ImportError('No module named s3utils',),) [type:u'application/x-python-serialize' encoding:u'binary' headers:{}] 

body: '\x80\x02}q\x01(U\x07expiresq\x02NU\x03utcq\x03\x88U\x04argsq\x04cimagekit.cachefiles.backends\nCelery\nq\x05)\x81q\x06}bcimagekit.cachefiles\nImageCacheFile\nq\x07)\x81q\x08}q\t(U\x11cachefile_backendq\nh\x06U\x12ca$ 
Traceback (most recent call last): 
    File "/opt/python/run/venv/lib/python2.6/site-packages/kombu/messaging.py", line 585, in _receive_callback 
    decoded = None if on_m else message.decode() 
    File "/opt/python/run/venv/lib/python2.6/site-packages/kombu/message.py", line 142, in decode 
    self.content_encoding, accept=self.accept) 
    File "/opt/python/run/venv/lib/python2.6/site-packages/kombu/serialization.py", line 184, in loads 
    return decode(data) 
    File "/usr/lib64/python2.6/contextlib.py", line 34, in __exit__ 
    self.gen.throw(type, value, traceback) 
    File "/opt/python/run/venv/lib/python2.6/site-packages/kombu/serialization.py", line 59, in _reraise_errors 
    reraise(wrapper, wrapper(exc), sys.exc_info()[2]) 
    File "/opt/python/run/venv/lib/python2.6/site-packages/kombu/serialization.py", line 55, in _reraise_errors 
    yield 
    File "/opt/python/run/venv/lib/python2.6/site-packages/kombu/serialization.py", line 184, in loads 
    return decode(data) 
    File "/opt/python/run/venv/lib/python2.6/site-packages/kombu/serialization.py", line 64, in pickle_loads 
    return load(BytesIO(s)) 
DecodeError: No module named s3utils 

s3utils является то, что определяет мои пути ковшеобразного AWS S3. Я отправлю его, если потребуется, но странная вещь, я думаю, что синхронный бэкэнд не имеет проблем с импортом s3utils, а асинхронный делает ... и асинхронно делает ТОЛЬКО на рабочем сервере, а не локально.

Я был бы так благодарен за любую помощь, отлаживая это. Я боролся с этим в течение нескольких дней. Я все еще изучаю Django и python, поэтому я надеюсь, что это глупая ошибка с моей стороны. Мой Google-фу провалил меня.

+0

Вы недавно перезапустили своего работника сельдерея? – matthewwithanm

+0

Как часто следует возобновлять работу сельдерея? Кажется, это сработало - СПАСИБО! Как новичок, это даже не перешло мне в голову. Я рад, что это было простое решение. И спасибо за вашу работу над ImageKit! Если вы хотите опубликовать свой комментарий в качестве ответа, я пойду дальше и отметю его. – user2616836

+0

Спасибо за приятные слова (: – matthewwithanm

ответ

3

Как я наметил в своем комментарии выше, такого рода вещи обычно вызваны тем, что забывают перезапустить рабочего.

Это обычная добыча с сельдереем. Рабочие - это отдельный процесс с вашего веб-сервера, поэтому у них есть собственные версии загруженного кода. И точно так же, как с вашим веб-сервером, если вы внесете изменения в свой код, вам нужно перезагрузить, чтобы он увидел изменение. Веб-сервер разговаривает с вашим рабочим не с помощью прямого запуска кода, а путем передачи сериализованных сообщений через the broker, что скажет что-то вроде «вызвать функцию do_something()». Затем работник прочтет это сообщение и - и вот сложная часть вызова его версия от do_something(). Поэтому, даже если вы перезагрузите свой веб-сервер (чтобы у него была новая версия вашего кода), если вы забудете перезагрузить рабочего (что фактически вызывает функцию), будет вызываться старая версия функции. Другими словами, вам нужно перезапустить рабочего при каждом изменении ваших задач.

Возможно, вы захотите проверить the autoreload option для разработки. Это может спасти вам некоторые головные боли.

Смежные вопросы