如何在django-rq enqueue中传递非必要的内置对象作为参数

时间:2015-02-21 05:02:51

标签: python django python-rq django-rq

更新:我发现我甚至无法通过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_bodyenqueue.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)

2 个答案:

答案 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