我正在开发的应用程序的简单想法是用户提供Linux命令,Linux命令的结果将显示在webbrowser中。这是我的views.py:
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.template import RequestContext
import subprocess
globalcmd = 0
globalresult = 0
def ls(request):
if request.method == 'POST':
globalcmd = request.POST.get('command', False)
globalresult = subprocess.call(['globalcmd'], shell=True)
return HttpResponseRedirect('/thanks/')
else:
pass
return render_to_response('form.html', {'cmd':'cmd'}, context_instance=RequestContext(request))
def show_template(request):
return render_to_response('thanks.html', {'globalok':globalresult}, context_instance=RequestContext(request))
我从form.html获得输入,由view'ls'处理。作为用户,我只是使用ls命令进行测试。每当我按ls命令时,它都由suprocess.call处理并存储在globalresult中,稍后在thanks.html中调用。我的输出是0.我做错了什么?这是thanks.html:
<h1>
{{ globalresult }}
</h1>
答案 0 :(得分:3)
检查function you are calling的文档,结果是调用的返回码,而不是命令本身的输出。所以,我认为你的代码完全符合它的要求。
也许您打算致电subprocess.check_output?
作为旁注,请注意这种网络终端互动;如果你在没有适当安全的情况下将这个Web应用程序暴露给互联网,那么就会发生不好的事情....但你可能知道这一点。
答案 1 :(得分:1)
您没有将globalresult
传递给show_template()中的thanks.html模板
return render_to_response('thanks.html', {'globalresult':globalresult}, context_instance=RequestContext(request))
如果懒惰你也可以做
return render_to_response('thanks.html', locals(), context_instance=RequestContext(request))
...虽然您似乎正在尝试重定向到感谢页面(?)。在这种情况下,最好只渲染感谢视图immediatley
e.g。替换这一行
return HttpResponseRedirect('/thanks/')
上面的两行中的任何一行^回答