2013-03-15 65 views
0

我有一个简单的视图,它将CSV数据上传到映射模型并填充数据。这是完美的,但现在我想整合Celery,我真的很努力地完成以下任务。我正在尝试芹菜与Django和Amazon SQS用芹菜简单导入任务

这是我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) 

这给错误的芹菜1日尝试日志: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.py通过传递请求,而不是

@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**

我怎样才能完成这项任务?我确定这是非常简单的:)正如你可以看到我已经尝试了上面几个不同的事情来创建这个任务。

回答

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()