1

CSV データをマップされたモデルにアップロードしてデータを入力する単純なビューがあります。これは完璧に機能しますが、今はセロリを統合したいと思っており、次のタスクを機能させるのに本当に苦労しています。Django とAmazon SQSで Celery を試しています。

view.pyこれは、タスクを実行するmy の主要部分です。

    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 での 2 回目の試行

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

代わりにリクエストを渡して task.py で 3 回目の試行

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

どうすればこのタスクを達成できますか? とても単純なことだと確信しています:) ご覧のとおり、このタスクを作成するために上記のいくつかの異なることを試しました。

4

1 に答える 1

0

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

ファイルのアップロードを処理する新しいモデルを作成し、セロリを使用してインポートを実行します。この方法では、タスクは単なるジョブ ID です。

@task
def process_upload(upload_id):
    upload = Uploads.objects.get(id=upload_id)
    upload.process()
于 2013-03-15T12:58:36.373 に答える