如何在Django REST API收到新POST条目时执行指定Python脚本
可行实现方案汇总
以下是不同场景下的落地方式,可根据你的项目规模、脚本运行时长选择匹配的方案:
方案1:接口同步调用(入门首选,适合轻量场景)
- 适用场景:目标Python脚本运行耗时低于2秒,无高并发上传需求
- 实现步骤:
- 先完成DRF上传接口开发,用
ImageField接收Flutter端提交的图片文件,上传校验通过后将文件存储到本地媒体目录或对象存储,拿到文件的可访问路径/绝对路径 - 视图逻辑中拿到路径后直接调用脚本,两种调用方式可选:
- 如果脚本逻辑可封装成函数,直接import对应函数,把图片路径作为参数传入执行
- 如果是独立的
.py脚本,用subprocess模块调用:subprocess.run(["python", "你的脚本路径.py", 图片保存路径], check=True)
- 先完成DRF上传接口开发,用
- 注意事项:该方式会阻塞接口响应,脚本运行多久Flutter端就要等多久,耗时过长容易触发接口超时,不适合生产环境高流量场景。
方案2:异步任务队列(生产环境首选,稳定性最高)
- 适用场景:脚本运行时间长、上传并发量高的正式项目
- 实现步骤:
- 选型Django生态常用的异步任务框架,推荐
Celery,搭配Redis/RabbitMQ作为消息中间件 - 把目标脚本的逻辑封装成Celery任务函数,入参设置为图片路径
- DRF接口完成图片保存后,不要直接运行脚本,调用
自定义任务函数.delay(图片保存路径)把任务推送到消息队列,直接返回响应给Flutter端 - 独立部署的Celery worker进程会自动拉取队列中的任务异步执行,完全不阻塞接口响应
- 选型Django生态常用的异步任务框架,推荐
- 注意事项:需要额外部署消息中间件和Celery worker进程,原生支持失败重试、任务状态查询、异常告警等能力,是生产环境的最优选择。
方案3:Django信号触发(逻辑解耦用)
- 适用场景:不想把脚本执行逻辑和上传视图耦合,后续需要灵活调整触发规则的场景
- 实现步骤:
- 定义图片上传的模型,比如
UploadedImage,包含图片字段、上传时间、状态等基础字段 - 给该模型绑定
post_save信号,设置触发条件为created=True,即只有新图片记录创建时才触发 - 信号处理函数中调用脚本逻辑,推荐搭配上述的Celery异步任务一起使用,避免阻塞接口
- 定义图片上传的模型,比如
- 注意事项:默认信号是同步执行的,直接跑长耗时脚本一样会阻塞响应,建议不要单独使用。
方案4:文件系统监听(零侵入现有接口)
- 适用场景:不想改动现有DRF上传接口的代码,脚本和Django服务完全独立的场景
- 实现步骤:
- 所有上传的图片统一存储到指定的目录下
- 用
watchdog这类Python库写一个独立运行的监听脚本,实时监控目标目录的新文件写入事件 - 监听到新图片文件写入完成后,自动调用目标脚本执行逻辑
- 注意事项:需要单独维护监听进程,要做好文件写入未完成就触发、重复触发的兼容逻辑,适合非强实时要求的场景。
通用注意事项:所有方案都要做好异常捕获和运行日志留存,方便排查问题;涉及文件路径、脚本执行的操作要提前校验进程权限,避免因为Django/worker进程没有图片访问权限、脚本执行权限导致运行失败。
内容的提问来源于stack exchange,提问作者Vikram
相关产品推荐
相关产品推荐

