当前位置: 首页 > web >正文

【Dv3Admin】系统异步任务配置文件解析

大规模数据导出常导致系统响应迟缓甚至失败,将其交由后台异步处理成为高效解决方案。Celery 配合 Django 实现了数据生成、格式化、上传的完整链路,显著提升了用户体验和系统稳定性。

本文解析 dvadmin/system/tasks.py 模块,重点讲解异步生成 Excel 文件、动态调整列宽、同步任务状态至后台下载中心的整体逻辑,并探讨其设计实现与应用场景。

文章目录

  • tasks.py
  • 项目源码解析
  • 应用案例
  • 总结

tasks.py

本系统通过 Django + Celery 组合实现异步数据导出功能,避免因大数据量处理导致界面卡顿或超时。dvadmin/system/tasks.py 文件专门处理将后台数据异步生成 Excel 文件并上传至文件系统,让用户能够在后台下载导出结果。通过 Celery 任务,将复杂数据处理过程分离到后台,前端只需要关注任务状态,无需长时间等待。

项目特点描述
技术栈Django ORM + Celery + OpenPyXL
功能定位异步导出海量数据生成 Excel 文件并上传
调度方式使用 Celery 后台调度,状态实时同步至下载中心
文件生成利用 OpenPyXL 动态生成带格式化表格的 Excel 文件

dvadmin/system/tasks.py 文件主要负责定义 async_export_data 异步任务。该任务从传入的数据列表生成 Excel 文件,自动适配列宽,支持数据格式处理(如日期格式化),并将生成的文件存入下载中心(DownloadCenter 模型)记录中。过程中根据任务执行情况动态更新下载任务状态,包括执行中、完成、失败等,异常时记录错误信息,提升系统稳定性与可维护性。

模块职责说明
定义异步任务使用 Celery 装饰器注册 async_export_data 异步任务
数据导出处理将字典型数据列表转换为格式化的 Excel 表格文件
自动列宽调整根据数据内容自动调整每一列的列宽,提升导出文件可读性
下载中心状态同步任务开始、成功、失败时分别更新 DownloadCenter 记录状态
错误处理与容错捕获异常并记录错误描述,避免任务中断影响系统稳定性

在需要从后台批量导出大数据量报表时使用 /system/tasks.py 定义的异步任务,例如导出用户列表、操作日志、财务数据等。通过异步处理,不影响主线程正常响应,用户可以在后台下载中心查看任务执行状态和最终文件下载链接,从而实现良好的用户体验。

使用场景说明
用户列表大批量导出异步生成用户 Excel 文件,避免接口超时
系统日志批量导出按查询条件导出操作日志至本地文件,后台任务生成下载链接
财务流水报表导出处理百万级数据生成 Excel,提升系统响应速度
后台管理系统批量数据导出支持任意模块导出,灵活配置导出字段与格式

项目源码解析

工具函数:字符串与数字处理

这一部分提供基础工具,计算字符串显示长度、判断字符串是否为数字,主要服务于后续动态调整导出表格列宽。完全独立,不依赖其他模块,可随时复用或替换。

def is_number(num):try:float(num)return Trueexcept ValueError:passtry:import unicodedataunicodedata.numeric(num)return Trueexcept (TypeError, ValueError):passreturn Falsedef get_string_len(string):length = 4if string is None:return lengthif is_number(string):return lengthfor char in string:length += 2.1 if ord(char) > 256 else 1return round(length, 1) if length <= 50 else 50

异步任务:数据导出成Excel

这一部分通过 Celery 后台任务异步生成 Excel 文件,结合 DownloadCenter 保存生成记录,依赖 openpyxl 库处理表格。与文件存储、下载模块深度协作,可拆换为其他格式生成逻辑。

@app.task
def async_export_data(data: list, filename: str, dcid: int, export_field_label: dict):instance = DownloadCenter.objects.get(pk=dcid)instance.task_status = 1instance.save()sleep(2)try:wb = Workbook()ws = wb.activeheader_data = ["序号", *export_field_label.values()]hidden_header = ["#", *export_field_label.keys()]df_len_max = [get_string_len(ele) for ele in header_data]row = get_column_letter(len(export_field_label) + 1)column = 1ws.append(header_data)for index, results in enumerate(data):results_list = []for h_index, h_item in enumerate(hidden_header):for key, val in results.items():if key == h_item:if val is None or val == "":results_list.append("")elif isinstance(val, datetime):val = val.strftime("%Y-%m-%d %H:%M:%S")results_list.append(val)else:results_list.append(val)result_column_width = get_string_len(val)if h_index != 0 and result_column_width > df_len_max[h_index]:df_len_max[h_index] = result_column_widthws.append([index + 1, *results_list])column += 1for index, width in enumerate(df_len_max):ws.column_dimensions[get_column_letter(index + 1)].width = widthtab = Table(displayName="Table", ref=f"A1:{row}{column}")style = TableStyleInfo(name="TableStyleLight11",showFirstColumn=True,showLastColumn=True,showRowStripes=True,showColumnStripes=True,)tab.tableStyleInfo = stylews.add_table(tab)stream = BytesIO()wb.save(stream)stream.seek(0)s = md5()while True:chunk = stream.read(1024)if not chunk:breaks.update(chunk)stream.seek(0)instance.md5sum = s.hexdigest()instance.file_name = filenameinstance.url.save(filename, ContentFile(stream.read()))instance.task_status = 2except Exception as e:instance.task_status = 3instance.description = str(e)[:250]instance.save()

应用案例

异步导出模块在后台数据下载中心的实践应用

后台管理系统中,导出功能是常见但极易拖垮响应性能的操作,尤其在面对百万级别数据时,同步生成 Excel 文件会显著拖慢前端响应,甚至造成请求超时。为解决这一问题,系统将导出任务通过 Celery 异步处理,并借助下载中心模块进行任务状态管理和结果交付。dvadmin/system/tasks.py 模块承担了这一机制的任务定义核心角色,负责数据生成、格式优化、任务状态同步与文件存储全过程。

功能点内容描述
问题背景面对百万级数据,直接同步生成 Excel 文件会拖垮前端响应性能,甚至导致请求超时。
解决方案使用 Celery 异步处理导出任务,并通过下载中心模块管理任务状态与结果交付。
核心模块dvadmin/system/tasks.py:负责数据生成、格式优化、任务状态同步与文件存储全过程。
导出流程1. 用户发起导出请求,系统向下载中心写入“待生成”记录。
2. 异步调用 async_export_data 任务,进入后台导出流程。
任务状态管理- 任务启动后更新状态为“执行中”。
- 导出完成后更新下载中心模型,生成可下载链接。
Excel 文件处理- 读取数据、构造 Excel 表格。
- 动态设置列宽,优化表格展示效果。
用户体验- 用户通过下载中心查看进度与结果,无需等待接口响应。
- 整个过程对用户完全透明。

当用户在前端发起导出请求时,系统立即向下载中心写入一条“待生成”记录,并异步调用 async_export_data 任务,后台进入数据导出流程。任务启动后自动更新状态为“执行中”,读取数据、构造 Excel 表格、动态设置列宽,并将结果写入下载中心模型,最终形成可供下载的链接。整个过程对用户完全透明,用户只需通过后台下载中心查看进度与结果,无需等待接口响应。

异步导出任务在用户管理模块的应用逻辑

以用户数据导出为例,管理员在用户管理界面中点击“导出”后,系统会将当前筛选条件下的用户数据打包成列表数据,并通过以下调用方式触发导出任务:

async_export_data.delay(data=export_queryset,filename="用户导出.xlsx",dcid=download_center_id,export_field_label={"username": "用户名","email": "邮箱","is_active": "状态","date_joined": "注册时间"}
)

该任务接收导出数据列表 data 与导出字段字典 export_field_label,根据后者构建 Excel 表头。任务执行时创建 Workbook 表格,使用 openpyxl 将每条数据插入表中,首列自动添加序号。为避免内容溢出或显示不全,任务通过工具函数 get_string_len 分析每一列的实际长度,并设置合理的列宽。

任务完成后生成的 Excel 文件被写入下载中心绑定的 url 字段,任务状态设为成功(2),并计算文件的 MD5 值用于校验。若任务中途出错,如数据异常或格式转换失败,系统捕获异常并将状态标记为失败(3),错误描述存入 description 字段,用户可据此排查问题。

后台导出任务在系统日志模块中的场景适配

在操作日志管理界面,运维人员可能需要导出大量历史记录以备审计。此时,由于日志数据包含时间、操作人、路径等字段且体量庞大,同步导出极易失败。系统使用相同的任务机制处理日志导出,仅调整数据来源与字段标签定义,即可复用导出逻辑。

功能点内容描述
需求背景运维人员需要导出大量历史操作日志以备审计,但同步导出因数据量庞大易导致失败。
解决方案使用与其他模块相同的任务机制处理日志导出,调整数据来源与字段标签定义以复用导出逻辑。
触发方式- 前端触发:用户手动发起导出任务。
- 后台定时任务:定期执行日志批量归档。
技术实现- 采用 Celery 分布式调度,支持并发处理多个导出任务。
- 结合下载中心形成导出记录池。
管理功能- 支持任务状态筛选、按时间查询。
- 提供任务失败重试能力。
企业级特性通过任务机制与下载中心构建出数据导出管理机制,满足企业级审计与归档需求。

任务可通过前端触发,或由后台定时任务定期执行,将日志批量归档。通过 Celery 分布式调度,支持并发处理多个导出任务,结合下载中心形成导出记录池,支持状态筛选、按时间查询、任务失败重试等能力,构建出企业级的数据导出管理机制。

总结

模块以 Celery 后台任务为核心,将导出逻辑与主流
程彻底解耦。数据处理细化到格式转换、列宽适配,极大提升导出文件的可读性。任务执行状态与下载中心实时同步,保证任务追踪透明。异常捕获和容错机制增强了整体稳定性。

任务过程中的状态同步采用同步数据库写操作,高并发下可能影响性能。异常处理粒度较粗,无法精准区分不同错误类型。生成文件过程依赖同步 IO,可考虑引入流式写入或异步文件系统以进一步提升处理效率。

http://www.xdnf.cn/news/14501.html

相关文章:

  • 朴素贝叶斯:用条件逻辑照亮未知
  • 七 医学影像云平台-影像检验互联互认平台建设中遇到的问题
  • WIP数据,有bad wafer/lot,追踪设备/机台问题
  • Java 变量类型转换的选择题
  • react小白学习快速上手
  • Appium+python自动化(二十四) - 元素等待
  • 在虚拟机 银河麒麟|ubuntu 中安装和配置NVIDIA显卡驱动
  • 设计模式精讲 Day 2:工厂方法模式(Factory Method Pattern)
  • 多模态学习路线(3)——MLLMs主流大模型
  • 基于统计检验与机器学习模型对牛油果数据的分析与预测
  • Python 文件操作详解
  • 算法题(170):地毯填补问题
  • Proteus8.17-安装说明
  • 揭开MongoDB的神秘面纱:从陌生到初识
  • 【Elasticsearch】文档(一):新增 删除
  • vue中的h渲染函数
  • Java项目中使用到的技术——《异步调用》
  • java+vue+SpringBoo摄影师分享交流社区(程序+数据库+报告+部署教程+答辩指导)
  • 大模型笔记6:微调
  • Go多个协程实现顺序打印
  • 华为OD机试_2025 B卷_运维日志排序(Python,100分)(附详细解题思路)
  • sudo apt-get install openssh-serve安装失败解决
  • 自定义Spring Boot Starter开发指南
  • JS当中怎么定义一个类
  • 【Quest开发】初始项目环境配置
  • Hive集成Paimon
  • 华为云国际版有区块链吗
  • Windows 系统中扩大 WSL2 的内存限制
  • YSYX学习记录(九)
  • 2026 AAAI 投稿要求