更新:我发现我甚至不能通过enqueue中的一个类,这可以这样做吗?
我希望将一个item对象(Django中的一个模型)作为queue.enqueue(grabber.parse_body, item)中的参数传递,但是rqworker将引发此异常(无论是否使用它,当我尝试将该项作为参数传递时):
文件"/usr/local/lib/python3.4/dist-packages/rq/job.py",第53行,在unpickle引发UnpickleError(‘不能解泡菜。’,pickled_string,e) rq.exceptions.UnpickleError:(‘不能解酸洗’,ImproperlyConfigured(‘请求设置INSTALLED_APPS,但设置没有配置。您必须在访问设置之前定义环境变量DJANGO_SETTINGS_MODULE或调用settings.configure( ) )。’)
似乎parse_body不知道item是什么?
我知道我可以将项的id作为参数传递,然后在parse_body**,中处理id,但这是否可以在 parse_body**?**中直接使用** item
我的主要代码:(enqueue.py和grabber.py是独立的脚本,而不是Django应用程序中的脚本。)
enqueue.py
import os
import grabber
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "website.settings.development")
queue = django_rq.get_queue('default')
need_to_parse = Post.objects.all()
for item in need_to_parse:
queue.enqueue(grabber.parse_body, item)grabber.py
def parse_body(item):
print(item)发布于 2015-02-21 19:39:50
问题是RQ的默认pickler是cPickle,它不知道如何序列化django模型实例。一种更简单的方法是使用model_to_dict并向队列传递一个可选择的对象。
from django.models import model_to_dict
my_dict = model_to_dict(my_instance,fields=[],exclude=[])如果您打算在队列中使用django模型实例,您可以创建自己的作业类,它首先使用PickleSerializer,然后将Queue.job设置为新的CustomJob(作业)。https://docs.djangoproject.com/en/1.7/topics/http/sessions/#bundled-serializers
发布于 2020-02-09 15:48:30
我有相同的错误消息,因为我用命令启动rqworker
$ rqworker
我用打字来解决这个问题
$ python manage.py rqworker
https://stackoverflow.com/questions/28642323
复制相似问题