首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在django-rq队列中传递非必要的内建对象作为参数

如何在django-rq队列中传递非必要的内建对象作为参数
EN

Stack Overflow用户
提问于 2015-02-21 05:02:51
回答 2查看 1.2K关注 0票数 0

更新:我发现我甚至不能通过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.pygrabber.py是独立的脚本,而不是Django应用程序中的脚本。)

enqueue.py

代码语言:javascript
复制
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

代码语言:javascript
复制
def parse_body(item):
    print(item)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-21 19:39:50

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

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2020-02-09 15:48:30

我有相同的错误消息,因为我用命令启动rqworker

$ rqworker

我用打字来解决这个问题

$ python manage.py rqworker

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28642323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档