使用Django Celery进行文件上传和下载

2023-04-11 00:00:00 django 下载 文件上传

Django Celery是一个基于Django框架的分布式任务调度系统,它可以帮助我们轻松地实现文件上传和下载。下面我们来详细介绍如何使用Django Celery进行文件上传和下载。

准备工作:

1.安装Django和Celery

pip install Django
pip install Celery

2.在Django工程中配置Celery

首先在项目中创建一个名为celery.py的文件,用于配置Celery:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目名.settings')

app = Celery('项目名')

app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

然后在项目的settings.py文件中加入如下配置:

CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_TIMEZONE = 'Asia/Shanghai'

# 在INSTALLED_APPS中添加celery
INSTALLED_APPS = [
    ...
    'celery',
    ...
]

# 在最底下加入如下代码
from celery.schedules import crontab
CELERY_BEAT_SCHEDULE = {
    'task-name': {
        'task': 'app.tasks.task_name',
        'schedule': crontab(minute='*'),
    },
}

其中CELERY_BROKER_URLCELERY_RESULT_BACKEND的配置表示我们使用本地的Redis作为消息中间件(也可以使用RabbitMQ等),CELERY_TIMEZONE配置时区为上海。

3.实现文件上传和下载

接下来,我们将分别介绍如何实现文件上传和下载。

文件上传:

假设我们有一个上传文件的视图函数,代码如下:

from django.shortcuts import render
from django.http import HttpResponse
from project.tasks import upload_task

def upload_file(request):
    if request.method == 'POST':
        file = request.FILES.get('file', None)
        if not file:
            return HttpResponse('no file')
        # 调用异步任务
        upload_task.delay(file.read(), file.name)
    return render(request, 'upload.html')

上面的代码中,我们获取到用户上传的文件,然后通过upload_task函数将文件异步上传。下面是upload_task函数的实现:

from __future__ import absolute_import, unicode_literals
from celery import shared_task
import os

@shared_task
def upload_task(file_content, file_name):
    with open(os.path.join(BASE_DIR, 'upload', file_name), 'wb+') as f:
        f.write(file_content)

上面的代码中,upload_task函数用于接收文件内容和文件名,然后将文件内容写入到本地磁盘上。这里要注意的是,由于我们是在异步任务中进行文件操作,所以要注意文件路径的获取方式。上面的代码中,我们使用了os.path.join(BASE_DIR, 'upload', file_name)来获取上传文件的路径。

文件下载:

类似地,我们也可以在后台异步下载文件。例如,我们有一个下载文件的视图函数,代码如下:

from django.http import FileResponse
from project.tasks import download_task

def download_file(request):
    file_name = 'pidancode.txt'
    # 调用异步任务
    download_task.delay(file_name)
    # 返回响应
    response = FileResponse(open(os.path.join(BASE_DIR, 'download', file_name), 'rb'))
    response['Content-Type'] = 'application/octet-stream'
    response['Content-Disposition'] = 'attachment;filename="{}"'.format(file_name)
    return response

上面的代码中,我们调用了download_task函数来异步下载文件。然后我们构造一个FileResponse对象返回给用户浏览器,浏览器会自动下载文件。下面是download_task函数的实现:

@shared_task
def download_task(file_name):
    with open(os.path.join(BASE_DIR, 'download', file_name), 'w+') as f:
        f.write('pidancode.com\n皮蛋编程')

上面的代码中,download_task函数用于异步生成下载文件,并将文件内容写入到本地磁盘。这里我们写入了字符串“pidancode.com\n皮蛋编程”到文件中。

至此,我们就成功地使用Django Celery进行了文件上传和下载。

相关文章