更新:我发现我甚至无法通过enqueue
中的课程,是否可以这样做?
我想传递一个item
对象(Django中的模型)作为queue.enqueue(grabber.parse_body, item)
中的参数,但rqworker
会引发此异常(一旦我尝试将该项传递为参数,尽管我是否使用它):
File" /usr/local/lib/python3.4/dist-packages/rq/job.py" ;,第53行,在 unpickle 引发UnpickleError('无法解开。',pickled_string,e)rq.exceptions.UnpickleError :('无法解开。', 配置不正确('请求设置INSTALLED_APPS,但设置 未配置。您必须定义环境变量 DJANGO_SETTINGS_MODULE或在访问之前调用settings.configure() 设置'。,))
似乎parse_body
不知道item
是什么?
我知道我可以将项目的ID作为参数传递,然后在parse_body
中处理ID,但这可以直接在{{1}中使用item
}}吗
我的主要代码:
(parse_body
和enqueue.py
是独立脚本,而不是Django应用程序。)
enqueue.py
grabber.py
grabber.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)
答案 0 :(得分:2)
问题是RQ的默认选择器是cPickle,它不知道如何序列化django模型实例。一种更简单的方法是使用model_to_dict并将可选对象传递给队列。
from django.models import model_to_dict
my_dict = model_to_dict(my_instance,fields=[],exclude=[])
如果您打算在队列中使用django模型实例,则可以先创建自己的Job类,然后使用PickleSerializer,然后将Queue.job设置为新的CustomJob(Job)。 https://docs.djangoproject.com/en/1.7/topics/http/sessions/#bundled-serializers
答案 1 :(得分:0)
我有相同的错误消息,因为我使用命令
启动了rqworker$ rqworker
我通过输入
解决了这个问题$ python manage.py rqworker