0

更新:我发现我什至不能通过一个类enqueue,这可能吗?


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

文件“/usr/local/lib/python3.4/dist-packages/rq/job.py”,第 53 行,在 unpickle 中引发 UnpickleError('Could not unpickle.', pickled_string, e) rq.exceptions.UnpickleError: ( 'Could not unpickle.', ImproperlyConfigured('请求设置 INSTALLED_APPS,但设置未配置。您必须在访问设置之前定义环境变量 DJANGO_SETTINGS_MODULE 或调用 settings.configure()。',))

好像parse_body不知道item是什么?

我知道我可以将项目的 id 作为参数传递,然后处理 id in parse_body,但这可以item直接使用 inparse_body吗?


我的主要代码:(enqueue.py并且grabber.py是独立脚本,不在 Django 应用程序中。)

入队.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)

抓取器.py

def parse_body(item):
    print(item)
4

2 回答 2

2

The problem is that RQ's default pickler is cPickle which does not know how to serialize django model instances. A simpler approach would be to use model_to_dict and pass a pickable object to your queue.

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

If you are intent on using django model instances in your queue, you can create your own Job class that uses a PickleSerializer first and then set your Queue.job to your new CustomJob(Job). https://docs.djangoproject.com/en/1.7/topics/http/sessions/#bundled-serializers

于 2015-02-21T19:39:50.993 回答
0

我有同样的错误信息,因为我用命令启动了 rqworker

$ rqworker

我通过键入来解决这个问题

$ python manage.py rqworker

于 2020-02-09T15:48:30.087 回答