2

私が開発しているアプリの単純なアイデアは、ユーザーが Linux コマンドを実行すると、Linux コマンドの結果が Web ブラウザーに表示されるというものです。これが私の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 に保存され、後で thank.html で呼び出されます。出力が 0 です。何が間違っていますか? ここにthanks.htmlがあります:

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

2 に答える 2

4

呼び出している関数のドキュメントを確認してください。結果は、コマンド自体の出力ではなく、呼び出しの戻りコードです。だから、あなたのコードはまさにそれがすべきことをしていると思います。

subprocess.check_outputを呼び出すつもりだったのでしょうか。

補足として、この Web 端末とのやり取りには十分注意してください。このWebアプリケーションを適切なセキュリティなしでインターネットに公開すると、悪いことが起こります....しかし、おそらくそれはご存知でしょう。

于 2012-11-09T07:31:56.930 に答える
1

globalresultshow_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/')

上記の 2 行のいずれかで ^ in ma answer

于 2012-11-09T07:47:28.433 に答える