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

How to pass Non-essential Built-in object as parameter in django-rq enqueue

更新:我发现我什至无法在 enqueue 中传递 class,这可以吗?


我想传递一个 item 对象(Django 中的模型)作为 queue.enqueue(grabber.parse_body, item) 中的参数,但是 rqworker 将引发此异常(一旦我尝试传递项目作为参数,不管我是否使用它):

File "/usr/local/lib/python3.4/dist-packages/rq/job.py", line 53, in unpickle raise UnpickleError('Could not unpickle.', pickled_string, e) rq.exceptions.UnpickleError: ('Could not unpickle.', ImproperlyConfigured('Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.',))

好像parse_body不知道item是什么?

我知道我可以只传递项目的 id 作为参数,然后在 parse_body 中处理 id,但这是否可以直接在 [=16] 中使用 item =]?


我的主要代码: (enqueue.pygrabber.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)

问题是 RQ 的默认 pickler 是 cPickle,它不知道如何序列化 django 模型实例。一种更简单的方法是使用 model_to_dict 并将一个可拾取对象传递到您的队列。

from django.models import model_to_dict
my_dict = model_to_dict(my_instance,fields=[],exclude=[])

如果您打算在队列中使用 Django 模型实例,您可以创建自己的作业 class,首先使用 PickleSerializer,然后将 Queue.job 设置为新的 CustomJob(Job) . https://docs.djangoproject.com/en/1.7/topics/http/sessions/#bundled-serializers

我收到了相同的错误消息,因为我使用命令

启动了 rqworker

$ rqworker

我通过输入

解决了这个问题

$ python manage.py rqworker