我是django的新手,我需要帮助。
我有一个正在运行的应用程序(遗留),我正在尝试在开发机器中添加一个新页面以运行一些脚本,这样设计人员就不必进行ssh登录。
我希望它运行脚本并将其输出返回到html页面,所以我已经这样做了:
url.py:
url(r'^DEVUpdate', 'myviewa.views.devUpdate'),
在视图中:
def devUpdate(request):
response = os.popen('./update.sh').read()
print response
return render_to_response('aux/update.html', locals(), context_instance=RequestContext(request));
在html中:
Response:
{{ response }}
进入DEVUpdate页面时的输出是在我的机器中:
sh: 1: ./update.sh: not found
但在html中:
Response:
如何在html中获取响应值?
PD:我想在html页面中看到“sh:1:./ update.sh:not found”消息
答案 0 :(得分:1)
os.popen
返回stdout上命令的输出。像这样的错误消息会发送给stderr,所以你不会得到它。
此外,os.popen已被弃用,正如the docs所述。相反,请使用subprocess.check_output
:
import subprocess
try:
# stderr=subprocess.STDOUT combines stdout and stderr
# shell=True is needed to let the shell search for the file
# and give an error message, otherwise Python does it and
# raises OSError if it doesn't exist.
response = subprocess.check_output(
"./update.sh", stderr=subprocess.STDOUT,
shell=True)
except subprocess.CalledProcessError as e:
# It returned an error status
response = e.output
最后,如果update.sh
花费的时间超过几秒钟,那么它可能应该是Celery调用的后台任务。现在整个命令必须在Django给出响应之前完成。但那与问题无关。
答案 1 :(得分:0)
您需要在上下文中传递响应:
return render_to_response('aux/update.html', locals(), context_instance=RequestContext(request, {'response': response});
现在您尝试从模板访问响应,但不在上下文中传递它