2014-11-06 1 views
0

Я новичок в django, и мне нужна помощь.получить результат сценария командной строки в качестве переменной шаблона

У меня есть рабочее приложение (наследие), и я пытаюсь добавить новую страницу в dev-машину, чтобы запустить некоторые скрипты, чтобы дизайнерам не нужно было вводить имя пользователя 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: Я хочу увидеть сообщение 'ш: 1: ./update.sh: не найден' на странице HTML

+1

Путь к udpate.sh неверен. –

+0

Можете ли вы опубликовать структуру каталогов? –

+0

Если путь не является неправильным, то какой контент? Сценарий оболочки может не работать. –

ответ

1

os.popen возвращает выход команды на стандартном выводе. Сообщение об ошибке, подобное этому, относится к 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 занимает больше, чем на пару секунд или около того, он должен вероятно быть фоновая задача вызывается сельдерея. Теперь вся команда должна закончить, прежде чем Django даст ответ. Но это не связано с вопросом.

+0

Возможно, вы захотите добавить, что полный путь к скрипту должен быть передан. –

+1

Я думаю, он знает это, его вопрос заключается в том, чтобы поймать ошибку в переменной ответа. – RemcoGerlich

+0

Я имел в виду следующее: 'sh: 1: ./update.sh: not found' –

0

Вам необходимо пройти ответ в контексте:

return render_to_response('aux/update.html', locals(), context_instance=RequestContext(request, {'response': response}); 

Right теперь вы пытаетесь получить доступ к ответу из шаблона, но не передаете его в контексте

+0

sholudn't locals() сделать это? – inigoD

+0

ну ... может быть, честно говоря, я не знаю, я его никогда не использовал, хотя прохождение прохождения должно работать, тем не менее, – 4rlekin

+0

Досадно, что когда я делаю распечатку locals(), он показывает «ответ»: ''. Итак, у меня есть переменная ответа, но не значение :( – inigoD

Смежные вопросы