You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中用户下载Zip文件后删除服务器文件及Celery使用疑问

Django下载Zip文件后自动删除服务器文件的实现方案

一、Celery方案(推荐生产环境使用)

1. 安装Celery及依赖

Celery需要消息中间件,常用Redis作为代理,执行以下命令安装:

pip install celery redis

2. 配置Celery到Django项目

假设你的Django项目根目录名为webapp:

  • 在webapp/目录下创建celery.py文件,内容如下:
import os
from celery import Celery

# 加载Django配置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webapp.settings')

# 初始化Celery
app = Celery('webapp')
# 从Django settings中读取Celery配置,前缀为CELERY_
app.config_from_object('django.conf:settings', namespace='CELERY')
# 自动发现所有app中的tasks.py文件
app.autodiscover_tasks()
  • 在webapp/__init__.py中添加以下代码,确保Django启动时加载Celery:
from .celery import app as celery_app

__all__ = ('celery_app',)
  • 在webapp/settings.py中配置Celery的代理和结果存储(可选):
# Redis作为消息代理
CELERY_BROKER_URL = 'redis://localhost:6379/0'
# Redis存储任务结果(如果不需要可以不配置)
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'

3. 编写异步删除任务

在你的业务app(比如myapp)中创建tasks.py文件,定义删除文件的异步任务:

import os
from celery import shared_task

@shared_task
def delete_server_file(file_path):
    if os.path.exists(file_path):
        os.remove(file_path)

4. 在视图中调用任务

生成Zip文件后,返回下载响应的同时,调用异步任务延迟删除文件(给用户留足够下载时间):

from django.http import FileResponse
from myapp.tasks import delete_server_file

def download_zip(request):
    # 假设这里已经完成Zip文件的生成,获取文件路径
    zip_file_path = "/path/to/generated/your_file.zip"
    
    # 构造下载响应
    response = FileResponse(
        open(zip_file_path, 'rb'),
        as_attachment=True,
        filename="download.zip"
    )
    
    # 延迟10秒执行删除任务,确保用户完成下载
    delete_server_file.apply_async(args=[zip_file_path], countdown=10)
    
    return response

5. 启动Celery Worker

在项目根目录下执行以下命令启动Celery worker,处理异步任务:

celery -A webapp worker --loglevel=info

二、轻量替代方案(非生产环境可选)

如果不想搭建Celery,可使用Python线程实现延迟删除,但不推荐在高并发生产环境使用:

import threading
import time
import os
from django.http import FileResponse

def delayed_delete(file_path, delay=10):
    time.sleep(delay)
    if os.path.exists(file_path):
        os.remove(file_path)

def download_zip(request):
    zip_file_path = "/path/to/generated/your_file.zip"
    response = FileResponse(
        open(zip_file_path, 'rb'),
        as_attachment=True,
        filename="download.zip"
    )
    
    # 启动线程执行延迟删除
    threading.Thread(target=delayed_delete, args=[zip_file_path]).start()
    
    return response

内容的提问来源于stack exchange,提问作者Sri2110

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:18:18