2

我正在开发的应用程序的简单想法是用户给出 Linux 命令,Linux 命令的结果将显示在网络浏览器中。这是我的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))

我从由视图“ls”处理的 form.html 获得输入。作为用户,我只是在使用 ls 命令进行测试。每当我按下 ls 命令时,它都会由 suprocess.call 处理并存储在 globalresult 中,稍后在thanks.html 中调用它。我的输出是 0。我做错了什么?这是Thanks.html:

<h1>
{{ globalresult }}
</h1>
4

2 回答 2

4

检查您正在调用的函数的文档,结果是调用的返回码,而不是命令本身的输出。所以,我认为你的代码完全符合它的要求。

也许您打算调用subprocess.check_output

附带说明一下,要非常小心这种网络终端交互;如果您在没有适当安全性的情况下将此 Web 应用程序公开到 Internet,将会发生不好的事情......但您可能知道这一点。

于 2012-11-09T07:31:56.930 回答
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))

...尽管您似乎正在尝试重定向以访问感谢页面(?)。在这种情况下,最好立即呈现感谢视图

例如替换这一行

return HttpResponseRedirect('/thanks/')

上面的两行中的任何一个 ^ 在 ma answer

于 2012-11-09T07:47:28.433 回答