如何在Django Web应用中调用使用Selenium的Python脚本处理上传文件
问题1:上传文件后触发原有脚本的实现方案
- 首先改造现有Selenium脚本:将原有逻辑封装为可接收文件路径作为入参的函数,保留现有写日志、发Telegram通知的逻辑,仅将输入文件的读取路径改为函数传入值即可,不用重构原有核心代码。如果原有脚本是独立可执行文件,也可以通过
subprocess模块调用,更推荐封装成函数直接调用,后续传参、获取运行状态更方便。 - Django侧先实现基础的文件上传功能:编写上传表单限制后缀仅为xlsx、csv格式,文件上传后存储到服务器指定目录,同时新建一张任务数据库表,字段至少包含:任务唯一ID、上传用户外键、源文件存储路径、任务状态(待执行/运行中/部分成功/全部成功/失败)、创建时间、完成时间、结果日志路径。文件上传成功后先写入任务记录,状态设置为待执行。
- 用异步任务队列处理脚本运行:绝对不要在Django的HTTP请求线程中直接运行Selenium脚本,这类IO密集型任务运行时间长,会直接导致请求超时。可以用Celery搭配Redis/RabbitMQ作为消息中间件实现异步调度,Django集成Celery后,给你封装好的Selenium函数加上Celery的任务装饰器,文件上传完成、任务记录写入后,直接将任务ID作为参数触发异步任务即可,不会阻塞用户的上传请求。
问题2:运行结果反馈方案
两种方案可以搭配使用,覆盖不同使用场景:
- 网页实时展示:如果需要用户能随时看进度,有两种实现方式。简单实现用前端轮询:每隔3-5秒前端调用一次任务状态查询接口,你可以新增一张任务详情表,Selenium脚本每处理完一行数据就往表中写入当前行的执行结果(对应数字、备注内容、执行状态、错误信息),接口直接返回这些数据即可实时展示进度。如果需要更低延迟的实时更新,可以用Django Channels实现WebSocket,脚本每执行完一步就主动推送给前端,不需要轮询。
- 完成后通知:原有Telegram通知可以保留,新增邮件通知也很简单,Django自带邮件发送模块,任务执行完成后直接从用户表中读取上传者的邮箱,把执行统计结果、日志文件作为正文或附件发送即可。如果同事不需要实时盯着进度,邮件通知更实用,用户上传文件后可以直接关闭页面,等通知就行。
额外优化建议
- Selenium启动时开启无头模式,服务器不需要部署GUI环境,运行更稳定,资源占用更低。
- 控制异步任务的并发数,通过Celery的worker数量配置限制同时运行的Selenium任务数,避免多个用户同时提交任务导致服务器资源耗尽。
- 所有上传的源文件、生成的日志、结果文件都按任务ID命名分类存储,避免文件覆盖,方便后续排查问题。
内容的提问来源于stack exchange,提问作者flokki
相关产品推荐
相关产品推荐

