Для этого необходимо выполнить следующие действия. Если вы не знаете, что такое «варианты» и «аргументы», прочитайте optparse background.
Каждая «команда» или «запрос» на самом деле является экземпляром модели. Определите модель вашего запроса со всеми параметрами, которые могут быть предоставлены пользователем.
Для простых опций вы должны указать поле с определенным списком CHOICES. Для опций «включено» или «выключено» (-x
в командной строке) вы должны предоставить список CHOICE с двумя понятными для человека значениями («Do X» и «Do not do X».)
Для параметров со значением необходимо предоставить поле, которое принимает значение параметра. Вы должны написать форму с подтверждением для этого поля. Мы вернемся к проверке значения параметра немного.
Для аргументов у вас есть вторая модель (с FK для первой). Это может быть просто, как одно поле FilePath, или может быть более сложным. Опять же, вам, возможно, придется предоставить форму для проверки экземпляров этой Модели.
Проверка варианта зависит от того, какой вариант он есть. Вы должны сузить допустимые значения, чтобы быть максимально узким набором символов и написать парсер, который абсолютно уверен в передаче только допустимых символов.
Ваши варианты попадут в те же категории, что и типы опций в optparse - string, int, long, choice, float и complex. Обратите внимание, что int, long, float и complex имеют правила проверки, уже определенные в моделях и формах Django. Выбор - это особый тип строки, уже поддерживаемый моделями и формами Django.
Осталось слово «струны». Определите допустимые строки. Напишите регулярное выражение для этих строк. Подтвердите использование регулярного выражения. В большинстве случаев вы никогда не сможете принять котировки ("
, '
или `) в любой форме.
Заключительный этап. У вашей модели есть метод, который испускает команду как последовательность строк, все готовые для subprocess.Popen
.
Редактировать
Это является основой нашего приложения. Это так часто, у нас есть одна модель с многочисленными формами, каждая из которых запускает специальную командную команду. Модель довольно общая. Формы - довольно специфические способы создания объекта Model. Именно так Django предназначен для работы, и он помогает соответствовать продуманным шаблонам дизайна Django.
Любое поле, доступное как открытое текстовое поле, является ошибкой. В каждом поле, которое открыто, должно быть регулярное выражение, чтобы указать, что разрешено. Если вы не можете формализовать регулярное выражение, вам нужно переосмыслить, что вы делаете.
Поле, которое не может быть ограничено регулярным выражением, не может быть параметром командной строки. Период. Прежде чем использовать его, он должен быть сохранен в столбце «Файл в базу данных».
Редактировать
Как это.
class MySubprocessCommandClass(models.Model):
myOption_1 = models.CharField(choice = OPTION_1_CHOICES, max_length=2)
myOption_2 = models.CharField(max_length=20)
etc.
def theCommand(self):
return [ "theCommand", "-p", self.myOption_1, "-r", self.myOption_2, etc. ]
Ваша форма ModelForm для этой модели.
У вас нет необходимости в save()
экземплярах модели. Мы сохраняем их, чтобы мы могли создать журнал точно, что было запущено.
Чтение через http://blog.littleimpact.de/index.php/2008/08/11/avoiding-shell-injection-in-ruby-python-and-php/ Кажется, я буду в порядке, поэтому long, как shell = False, по умолчанию. (То есть будет выполняться одна и только одна команда.) Это также то, что вы говорите? – gotgenes
Да, вот что я говорю. –