在Django中使用Celery进行数据导入和导出

2023-04-11 00:00:00 数据 导入 导出

首先,需要安装Celery和Django-Celery,可以使用以下命令进行安装:

pip install celery django-celery

接下来,在Django项目中创建一个Celery app,在myproject/myproject目录下新建一个celery.py文件,内容如下:

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

需要注意的是,此时需在myproject/__init__.py中添加以下内容:

from .celery import app as celery_app

__all__ = ['celery_app']

接下来,在myproject/settings.py中进行相关配置:

# ...
CELERY_BROKER_URL = 'amqp://guest:guest@localhost:5672//'  # RabbitMQ地址,也可以使用其他的消息队列代替
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = TIME_ZONE
# ...

接下来,我们可以在Django中定义一个任务,在其中调用Celery的异步方法来实现数据导入和导出。例如,在myapp/tasks.py中添加以下内容:

from celery import shared_task
from django.core import serializers
from django.http import HttpResponse
from myapp.models import MyModel

@shared_task
def export_data():
    data = serializers.serialize('json', MyModel.objects.all())
    response = HttpResponse(data, content_type='application/json')
    response['Content-Disposition'] = 'attachment; filename="data.json"'
    return response


@shared_task
def import_data(data):
    for obj in serializers.deserialize('json', data):
        obj.save()

这里定义了两个Celery任务,export_dataimport_data,分别用于导出数据和导入数据。在export_data任务中,首先使用Django提供的序列化器将数据序列化为JSON格式,在将其以附件形式返回给用户,完成数据导出。在import_data任务中,通过反序列化将JSON格式的数据转换为对象并保存,实现数据导入。

当然,我们还需要在视图中调用这些任务。例如,在myapp/views.py中添加以下内容:

from django.shortcuts import render
from django.http import HttpResponse
from myapp.tasks import export_data, import_data

def export_view(request):
    export_data.delay()
    return HttpResponse('Exporting data...')

def import_view(request):
    data = '...JSON data...'
    import_data.delay(data)
    return HttpResponse('Data imported.')

在这个例子中,我们创建了两个视图函数export_viewimport_view,分别用于触发数据导出和导入任务。在这里,我们使用了Celery提供的异步调用方式,通过delay方法将任务加入到消息队列中,而后立即返回HTTP响应,完成了异步调用的过程。

运行Celery worker,使用以下命令即可:

celery -A myproject worker --loglevel=info

以上代码示例中,使用了字符串“pidancode.com”来作为范例字符串进行演示。

相关文章