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

如何在Django REST API接收用户输入后同步运行Python脚本?

把Django REST API和本地Python脚本集成的实操指南

嘿,我完全懂你现在的困惑——一会儿看到论坛说用subprocess,一会儿又提request,刚接触这俩确实容易搞混。先给你把这俩的区别掰明白,再一步步教你把脚本和API串起来~

先搞懂:subprocess vs request(requests库)

  • subprocess:是用来在你的Django服务器内部运行本地的Python脚本/命令的,正好匹配你的需求——用户发请求到API,服务器直接执行你写的那个脚本,把用户传的输入递进去。
  • requests库:是用来让你的API调用外部的其他API服务的,比如如果你的脚本是部署在另一个服务器上的独立服务,那你可能需要用requests去发请求调用它。但你现在是要运行本地脚本,所以subprocess才是正确选择。

具体实现步骤

1. 先让你的Python脚本支持接收输入

首先确保你的脚本能通过命令行参数接收输入,比如你的脚本叫my_script.py,可以这么写:

# my_script.py
import sys

def handle_input(user_input):
    # 这里替换成你自己的脚本逻辑
    processed_result = f"已处理输入:{user_input}"
    return processed_result

if __name__ == "__main__":
    # 从命令行获取输入参数
    if len(sys.argv) >= 2:
        input_data = sys.argv[1]
        result = handle_input(input_data)
        # 把结果输出到标准输出,方便Django这边捕获
        print(result)
    else:
        print("错误:缺少输入参数")
        sys.exit(1)  # 返回非0状态码表示出错

2. 修改Django的views.py,集成subprocess

假设你的API是POST方法,接收用户的输入数据。修改你的view函数,用subprocess同步运行脚本:

# views.py
from django.http import JsonResponse
from rest_framework.decorators import api_view
import subprocess
import sys
import os

@api_view(['POST'])
def execute_script(request):
    # 从请求体里获取用户输入(假设请求JSON格式是 {"input": "你的内容"})
    user_input = request.data.get('input')
    if not user_input:
        return JsonResponse({"error": "请提供输入内容"}, status=400)
    
    # 脚本的绝对路径(避免因为Django运行路径导致找不到脚本)
    # 这里假设脚本和views.py在同一个目录下
    script_full_path = os.path.join(
        os.path.dirname(os.path.abspath(__file__)),
        "my_script.py"
    )

    try:
        # 同步运行脚本,传入用户输入作为参数
        # sys.executable确保用的是当前Django环境的Python解释器
        run_result = subprocess.run(
            [sys.executable, script_full_path, user_input],
            capture_output=True,  # 捕获脚本的输出和错误信息
            text=True,  # 以文本格式返回结果,而不是字节
            check=True  # 如果脚本运行返回非0状态码,会抛出CalledProcessError异常
        )

        # 提取脚本的标准输出作为结果返回
        script_output = run_result.stdout.strip()
        return JsonResponse({
            "success": True,
            "message": "脚本运行成功",
            "result": script_output
        })
    
    except subprocess.CalledProcessError as e:
        # 脚本运行出错(比如返回非0状态码)
        error_info = e.stderr.strip() if e.stderr else "脚本执行过程中发生未知错误"
        return JsonResponse({
            "success": False,
            "error": error_info
        }, status=500)
    
    except Exception as e:
        # 其他意外错误(比如找不到脚本、权限问题)
        return JsonResponse({
            "success": False,
            "error": str(e)
        }, status=500)

3. 配置URL路由

在你的app的urls.py里添加路由,让API能被访问:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    # 其他路由...
    path('run-script/', views.execute_script, name='run_script'),
]

几个重要注意事项

  • 同步运行的局限性:如果你的脚本运行时间很长(比如超过30秒),会导致API请求超时,因为Django默认的请求超时时间有限。如果是耗时操作,后续可以考虑用Celery做异步任务,但先从同步入门就好。
  • 安全风险:直接把用户输入传给脚本有注入风险!比如用户输入恶意命令片段,可能会执行危险操作。一定要对用户输入做校验:比如限制输入长度、只允许特定字符(比如字母、数字、常用符号),或者用参数化的方式传递输入(我们上面用的是命令行参数,已经比直接拼接命令安全很多,但还是要做输入校验)。
  • 权限问题:确保运行Django的用户(比如服务器上的www-data用户)有执行这个脚本的权限,以及脚本里用到的文件/资源的访问权限。
  • 环境一致性:用sys.executable调用脚本,能确保用的是当前Django虚拟环境里的Python解释器,避免因为环境不同导致脚本依赖缺失。

现在你可以启动Django服务器,用Postman或者curl发POST请求到/run-script/,传JSON格式的{"input": "你的测试内容"},就能看到脚本运行的结果啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:17:42