用Celery简单导入任务

时间:2013-03-15 09:34:07

标签: django django-celery

我有一个简单的视图,可以将CSV数据上传到映射模型并填充数据。这很完美,但现在我想整合Celery,我真的很难让以下任务发挥作用。我正在和Django和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次尝试通过传递请求来尝试在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 个答案:

答案 0 :(得分:1)

遵循此示例:http://codeinthehole.com/writing/use-models-for-uploads/

创建一个新模型来处理文件上传并使用celery来运行导入,这样任务就是作业id

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