如何在 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.py
和 grabber.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
更新:我发现我什至无法在 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.py
和 grabber.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