Django应用输入内容时报路径错误,修改路径后仍无法解决
Django路径触发错误问题修复方案
问题根因排查
- 第一处错误:
test.py字符串格式化语法错误
你现有代码中output = "hi" % (sys.argv[1], time)传入了2个参数,但字符串内没有对应占位符,运行直接抛出类型错误,会被外层Django判定为调用脚本失败,容易和路径错误混淆。 - 第二处错误:
views.py调用test.py使用硬编码相对路径
Django启动时的工作目录不固定,使用buttonpython/buttonpython/test.py这种相对路径会根据启动位置变化找不到文件,不管你修改路由路径是什么都不会生效。 - 附加隐藏问题:没有捕获
subprocess.run的标准错误输出,报错信息不完整无法定位具体是路径错误还是脚本本身运行错误。
修复步骤
- 修复
test.py格式化语法,补充对应占位符:
import sys import datetime time = datetime.datetime.now() # 补充2个%s占位符对应传入的两个参数 output = "hi %s 现在时间:%s" % (sys.argv[1], time) print(output)
- 修改
views.py的脚本路径为基于Django项目根目录的绝对路径,同时捕获错误输出:
Django项目settings.py内置了BASE_DIR变量指向项目根目录,导入后拼接路径即可避免相对路径的不稳定问题:
from django.shortcuts import render import requests import sys from subprocess import run, PIPE # 导入项目配置的根目录 from django.conf import settings import os def button(request): return render(request, 'home.html') def output(request): data = requests.get("https://www.google.com/") print(data.text) data = data.text return render(request, 'home.html', {'data': data}) def external(request): inp = request.POST.get('param') # 拼接得到test.py的绝对路径,不会随运行位置变化 test_py_path = os.path.join(settings.BASE_DIR, 'buttonpython', 'buttonpython', 'test.py') # 新增stderr=PIPE捕获错误信息,指定encoding避免输出二进制乱码 out = run([sys.executable, test_py_path, inp], shell=False, stdout=PIPE, stderr=PIPE, encoding='utf-8') # 脚本运行非0返回码时打印错误信息方便排查 if out.returncode != 0: print("脚本运行错误:", out.stderr) print(out) return render(request, 'home.html', {'data1': out.stdout})
- 确认你的路由配置和前端表单提交的
action属性完全匹配,大小写、首尾斜杠都要保持一致。
内容的提问来源于stack exchange,提问作者user16993309
相关产品推荐
相关产品推荐

