1

我正在使用 Django 1.6 和 Django-ImageKit 3.2.1。

我正在尝试使用 ImageKit 异步生成图像。异步图像生成在本地工作,但不在生产服务器上。

我正在使用 Celery,并且我都尝试过:

IMAGEKIT_DEFAULT_CACHEFILE_BACKEND = 'imagekit.cachefiles.backends.Async'

IMAGEKIT_DEFAULT_CACHEFILE_BACKEND = 'imagekit.cachefiles.backends.Celery'

使用Simple后端(同步)代替AsyncCelery在生产服务器上正常工作。所以我不明白为什么异步后端给我以下 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-fu 让我失望了。

4

1 回答 1

3

正如我在上面的评论中暗示的那样,这种事情通常是由于忘记重新启动工人造成的。

这是 Celery 的常见问题。工作人员与您的 Web 服务器是一个独立的进程,因此他们加载了自己的代码版本。就像您的网络服务器一样,如果您对代码进行更改,您需要重新加载以便它看到更改。Web 服务器不是通过直接运行代码来与您的工作人员对话,而是通过代理传递序列化消息,这会说诸如“调用函数do_something()”之类的内容。然后工作人员将阅读该消息并且——这是棘手的部分——调用它的版本do_something(). 因此,即使您重新启动网络服务器(以便它拥有新版本的代码),如果您忘记重新加载工作程序(实际上是调用该函数),也会调用旧版本的函数。换句话说,每当您对任务进行更改时,您都需要重新启动工作程序。

您可能想查看用于开发的 autoreload 选项。它可以为您节省一些头痛。

于 2014-04-11T02:12:45.147 回答