使用Django Celery进行文件上传和下载
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_URL
和CELERY_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进行了文件上传和下载。
相关文章