2015-02-21 4 views
0

Обновление: Я обнаружил, что не мог пройти класс в enqueue, возможно ли это сделать?Как передать несущественный Встроенный объект в качестве параметра в django-rq enqueue


Я хочу передать item объект (модель в Django) в качестве параметра в queue.enqueue(grabber.parse_body, item), но rqworker поднимет этот Exception (как только я попытался передать элемент в качестве параметра, несмотря ли использовать я его):

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 это?

Я знаю, что я мог бы просто передать идентификатор пункты, в качестве параметра, а затем иметь дело с идентификатором в parse_body, но это можно использовать item непосредственно в parse_body?


Мой главный код: (. 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) 

ответ

2

Проблема в том, что RQ's defaul t pickler - cPickle, который не знает, как сериализовать экземпляры модели django. Более простой подход состоял бы в том, чтобы использовать model_to_dict и передать выбранный объект в вашу очередь.

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

Если вы намерены использовать Джанго экземпляр модели в очереди, вы можете создать свой собственный класс работы, который использует PickleSerializer первого, а затем установить Queue.job к новому CustomJob (работа). https://docs.djangoproject.com/en/1.7/topics/http/sessions/#bundled-serializers