Для этого вы должны сделать следующее. Если вы не знаете, что такое «параметры» и «аргументы», прочитайте optparse background .
Каждая «Команда» или «Запрос» на самом деле является экземпляром модели. Определите модель запроса со всеми параметрами, которые кто-то может предоставить.
Для простых опций вы должны предоставить поле с определенным списком ВЫБОРОВ. Для опций, которые «включены» или «выключены» (-x
в командной строке), вы должны предоставить список CHOICE с двумя понятными для человека значениями («Do X» и «Do do do X».)
Для опций со значением вы должны предоставить поле, которое принимает значение опции. Вы должны написать форму с проверкой для этого поля. Мы немного вернемся к проверке значения параметра.
Для аргументов у вас есть вторая Модель (с FK на первую). Это может быть так же просто, как одно поле FilePath, или может быть более сложным. Опять же, вам также может понадобиться предоставить форму для проверки экземпляров этой модели.
Проверка параметров зависит от того, какой это вариант. Вы должны сузить допустимые значения до минимально возможного набора символов и написать синтаксический анализатор, который абсолютно уверен в передаче только допустимых символов.
Ваши опции попадают в те же категории, что и типы опций в optparse - string, int, long, choice, float и complex. Обратите внимание, что int, long, float и complex имеют правила проверки, уже определенные в моделях и формах 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()
экземпляры модели. Мы сохраняем их, чтобы мы могли создать журнал того, что именно было запущено.