2013-10-09 1 views
1

셀러리 작업 중에 모델에 변경 사항을 저장하려고 할 때 일부 동작이 발생했지만 변경 사항이 커밋되지 않습니다. 파일 업로드가 완료되면 csv를 처리하고 프로세스 결과를 데이터베이스에 저장하기 위해 셀러리 작업이 실행됩니다. 프로세스 상태, 시간은 레코드 수를 처리, 가공 등장고 셀러리 작업이 csv를 처리하는 중 - 모델 저장 안 함

models.py, 나는 다음과 같은 방법이 있습니다 _mark_processed 또는라고 _mark_failed 때

def import_records_data(self): 
    total_records = 0 
    with self.filepath.file as csvfile: 
     reader = csv.reader(csvfile, delimiter=',') 
     next(reader, None) # skip header 
     for row in reader: 
      # process record 
      total_records += 1 
    return total_records 

def process(self): 
    self.date_start_processing = datetime.datetime.utcnow().replace(tzinfo=utc) 
    try: 
     # process upload data, 
     records_processed = self.import_records_data() 
    except Exception, e: 
     self._mark_failed(unicode(e)) 
    else: 
     self._mark_processed(num_records=records_processed) 

def _mark_processed(self, num_records, description=None): 
    self.status = self.PROCESSED 
    self.date_end_processing = datetime.datetime.utcnow().replace(tzinfo=utc) 
    self.num_records = num_records 
    self.processing_description = description 
    self.save() 

def _mark_failed(self, description): 
    self.status = self.FAILED 
    self.processing_description = description 
    self.save() 

def was_processing_successful(self): 
    return self.status == self.PROCESSED 

는, 변경 사항이 데이터베이스시에 저장되지 않습니다 self.save()이 호출되었습니다. 이 메소드는 tasks.py에서 호출됩니다.

@task(name='csv-process-upload') 
def process_upload(upload_id): 
    upload = Upload.objects.get(id=upload_id) 
    upload.process() 

    if upload.was_processing_successful(): 
     message_user(
      upload.user, 
      "Your upload '%s' was processed successfully, %s records processed" % (
       upload.filename, 
       upload.num_records)) 
    else: 
     message_user(
      upload.user, 
      "Your upload '%s' could not be processed, error message: %s" % (
       upload.filename, 
       upload.processing_description,)) 

모델 저장을 방해 할 수있는 요인은 무엇입니까? 셸에서 _mark_processed을 디버그하고 self.save()을 입력하면 변경 사항이 데이터베이스에 반영됩니다.

+0

셀러리 작업을 어떻게 시작합니까? Django 뷰에서 트리거되는 경우, 초기 모델 저장/생성은 트랜잭션에서 유지 될 수 있으며 태스크가 실행될 때 샐러리에 표시되지 않습니다. –

+0

예,보기를 통해 트리거됩니다. 그러면 어떻게해야합니까? 감사. – mrkre

답변

1

django celery transactions을 사용하여 작업을 호출하여보기가 트랜잭션을 완료 한 후에 작업을 실행하도록하십시오.

+0

더 자세히 살펴보면 이전 셀러리 작업이 완료되지 않은 것 같았고 수동으로 제거해야했습니다. 작업은 장고 - 셀러리 트랜잭션에 의존하지 않고도 성공적으로 실행할 수있었습니다. – mrkre

+0

좋은 소리입니다. celery-flower ('--events'와 함께)에서 셀러리 작업자와 작업 대기열을 모니터링하는 멋진 웹 관리자를 확인하십시오. –

+0

팁 주셔서 감사. 그것을 한 번 봐야 할 것입니다. – mrkre

관련 문제