我使用Django 1.6和Django-ImageKit 3.2.1。
我正在尝试使用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 s3utilss3utils定义了我的AWS S3桶路径。如果需要的话,我会发布它,但奇怪的是,我认为同步后端导入s3utils没有问题,而异步则是.异步只在生产服务器上执行,而不是在本地执行。
如果能帮我调试这个,我会非常高兴的。几天来我一直在和这个搏斗。我还在学习Django和python,所以我希望这是一个愚蠢的错误。我的Google-fu让我失望了。
发布于 2014-04-11 02:12:45
正如我在上面的评论中暗示的那样,这类事情通常是由于忘记重新启动工人而造成的。
芹菜很常见。工作人员是一个独立于您的web服务器的进程,因此他们有自己的代码加载版本。和您的web服务器一样,如果您对代码进行了更改,则需要重新加载,以便它可以看到更改。web服务器不是通过直接运行代码,而是通过通过经纪人传递序列化消息来与您的工作人员对话,这会说“调用函数do_something()”之类的内容。然后,工作人员将阅读这条消息--这里有一个棘手的部分--调用其版本的do_something()。因此,即使您重新启动您的webserver (以便它有您的代码的新版本),如果您忘记重新加载工作人员(这实际上是调用函数),则将调用该函数的旧版本。换句话说,无论何时对任务进行更改,都需要重新启动工作人员。
您可能希望查看自动重新加载选项进行开发。它能让你省去一些头痛。
https://stackoverflow.com/questions/22888235
复制相似问题