2013-03-15 3 views
0

CSV 데이터를 매핑 된 모델에 업로드하고 데이터를 채우는 간단한보기가 있습니다. 이 작업은 완벽하지만 지금은 Celery을 통합하려고합니다. 다음 작업을 수행하는 데 정말로 어려움을 겪고 있습니다. 내가 장고와 함께 셀러리를 시도하고 Amazon SQS.Celery로 작업 가져 오기

이 작업을 실행 내 view.py의 주요 부분이다 :

def upload(request): 
     # If we had a POST then get the request post values. 
     if request.method == 'POST': 
      form = ContactUploadForm(request.POST, request.FILES) 
      # Check we have valid data 
      if form.is_valid(): 

       filename = handle_uploaded_file(request.FILES['file']) 

       import_csv.delay(filename) 

def handle_uploaded_file(f): 
    with open('name.csv', 'wb+') as destination: 
     for chunk in f.chunks(): 
      destination.write(chunk) 

이는 셀러리의 오류를주는 task.py

@task 
def import_csv(filename): 
    ContactCSVModel.import_from_file(filename) 

에 나의 첫번째 시도였다을 기록 : AttributeError: 'NoneType' object has no attribute 'seek'

내 두 번째 실제로는 SQS에 파일을 업로드하려고 시도하기 때문에 작동하지 않을 것이라고 생각하며 SQSError: 413 Request Entity Too Large을 제공합니다. 나는 이것이 내가하고 싶은 일이 아니라고 가정하고있다. 그 일은 SQS에 파일을 업로드하고 싶지 않다. task.py

@task 
def import_csv(filename): 
    ContactCSVModel.import_data(data = open(filename)) 

3에서

2 차 시도 대신

@task 
def import_csv(request): 
    filename = handle_uploaded_file(request.FILES['file']) 
    ContactCSVModel.import_data(data = open(filename)) 

이 오류 **Can't pickle <type 'cStringIO.StringO'>: attribute lookup cStringIO.StringO failed**

에게 제공 요청에 전달하여 task.py에서 시도 이 작업을 어떻게 수행 할 수 있습니까? 나는 그것이 매우 간단하다는 것을 확신한다 :) 위에서 볼 수 있듯이 나는이 작업을 만들기 위해 위의 몇 가지 다른 것들을 시도했다. 이 예에 따라

답변

1

: http://codeinthehole.com/writing/use-models-for-uploads/

는 파일 업로드를 처리하고 가져 오기를 실행하기 위해 셀러리를 사용하는 새로운 모델을 만들고, 이런 식으로 작업은 작업 ID입니다

@task 
def process_upload(upload_id): 
    upload = Uploads.objects.get(id=upload_id) 
    upload.process()