2017-05-03 53 views
0

我在模型中有驗證器。它進行驗證,然後驗證的數據將被保存到數據庫。
Django RQ處理長串行器作業

問題:
驗證,並致力於數據庫需要很長的時間。
因此,我決定用Django-rq來處理耗時的任務

views.py

def save_serializer(serializer, request): 
    serializer.save() 
    if bool(serializer.errors): 
     # If it has no errors it will be empty dictionary and bool({}) is False 
     msg = serializer.errors 
    else: 
     msg = serializer.data 

    email = EmailMessage(
     'Message From jobs.siamsbrand.com', 
     msg, 
     settings.C0D1UM_SENDER, 
     [request.user.email] 
    ) 
    email.send() 


class PriceListExcelFileList(generics.ListCreateAPIView): 
    permission_classes = (DRYPermissions,) 
    queryset = PriceListExcelFile.objects.all() 
    serializer_class = PriceListExcelFileSerializer 

    def perform_create(self, serializer, request): 
     """ 
     :param serializer: 
     :return: 
     """ 
     django_rq.enqueue(save_serializer, serializer, request) 

    def create(self, request, *args, **kwargs): 
     """ 
     I need to override the default behaviour because I am going to use rq and let it be an email notification 
     :param request: 
     :param args: 
     :param kwargs: 
     :return: 
     """ 
     serializer = self.get_serializer(data=request.data) 
     serializer.is_valid(raise_exception=True) 
     self.perform_create(serializer, request) 
     headers = self.get_success_headers(serializer.data) 
     data = { 
      "id": "Processing", 
      "file": "The response will be email to " + str(request.user.email) + " shortly", 
      "permission": "-" 
     } 
     return Response(data, status=status.HTTP_201_CREATED, headers=headers) 

錯誤消息:

File "/Users/el/Code/siam-sbrand/portal/apps/price_list_excel_files/views.py", line 52, in create 
    self.perform_create(serializer, request) 
    File "/Users/el/Code/siam-sbrand/portal/apps/price_list_excel_files/views.py", line 40, in perform_create 
    django_rq.enqueue(save_serializer, serializer, request) 
    File "/Users/el/.pyenv/versions/siam-sbrand/lib/python3.6/site-packages/django_rq/queues.py", line 208, in enqueue 
    return get_queue().enqueue(func, *args, **kwargs) 
    File "/Users/el/.pyenv/versions/siam-sbrand/lib/python3.6/site-packages/rq/queue.py", line 274, in enqueue 
    job_id=job_id, at_front=at_front, meta=meta) 
    File "/Users/el/.pyenv/versions/siam-sbrand/lib/python3.6/site-packages/django_rq/queues.py", line 60, in enqueue_call 
    return self.original_enqueue_call(*args, **kwargs) 
    File "/Users/el/.pyenv/versions/siam-sbrand/lib/python3.6/site-packages/django_rq/queues.py", line 56, in original_enqueue_call 
    return super(DjangoRQ, self).enqueue_call(*args, **kwargs) 
    File "/Users/el/.pyenv/versions/siam-sbrand/lib/python3.6/site-packages/rq/queue.py", line 227, in enqueue_call 
    job = self.enqueue_job(job, at_front=at_front) 
    File "/Users/el/.pyenv/versions/siam-sbrand/lib/python3.6/site-packages/rq/queue.py", line 292, in enqueue_job 
    job.save(pipeline=pipe) 
    File "/Users/el/.pyenv/versions/siam-sbrand/lib/python3.6/site-packages/rq/job.py", line 465, in save 
    connection.hmset(key, self.to_dict()) 
    File "/Users/el/.pyenv/versions/siam-sbrand/lib/python3.6/site-packages/rq/job.py", line 429, in to_dict 
    obj['data'] = self.data 
    File "/Users/el/.pyenv/versions/siam-sbrand/lib/python3.6/site-packages/rq/job.py", line 227, in data 
    self._data = dumps(job_tuple) 
TypeError: cannot serialize '_io.BufferedReader' object 
"POST /api/price-list-excel-files/ HTTP/1.1" 500 20430 
+0

同時等待響應。我正在計算這個'TypeError' – Sarit

+0

好像我必須用'fork'或'thread'來攻擊這個問題。希望我會朝着正確的方向 – Sarit

+0

主題是我的案例的答案 – Sarit

回答

0

它可以處理簡單的功能不是一個實例。然後我不得不用thread做長時間消耗的任務