要完成这个任务,你需要按照以下步骤进行操作。如果你不知道“选项”和“参数”是什么,请阅读
optparse背景。
每个“命令”或“请求”实际上都是一个模型的实例。使用所有可能提供的参数定义您的请求模型。
1. 对于简单选项,您必须提供一个具有特定CHOICES列表的字段。对于“开启”或“关闭”选项(在命令行中为
-x
),您应该提供一个CHOICE列表,其中包含两个易于理解的值(“执行X”和“不执行X”)。
2. 对于带有值的选项,您必须提供一个接受选项值的字段。您必须编写一个表单来验证此字段。稍后我们将回到选项值验证。
3. 对于参数,您需要一个第二个模型(具有对第一个模型的FK)。这可以是一个简单的FilePath字段,也可以更复杂。同样,您可能需要提供一个表单来验证此模型的实例。
选项验证因选项类型而异。您必须将可接受的值缩小为最窄的字符集,并编写一个绝对确定仅传递有效字符的解析器。
您的选项将分为与optparse中的选项类型相同的类别--字符串、int、long、choice、float和complex。请注意,Django的模型和表单已经定义了int、long、float和complex的验证规则。Choice是一种特殊的字符串,已被Django的模型和表单支持。
剩下的是“字符串”。定义允许的字符串。编写这些字符串的正则表达式。使用正则表达式进行验证。大多数情况下,您永远不可能接受引号(
"
,
'
或`)以任何形式。
最后一步。您的模型有一个方法,它将命令作为一系列字符串发出,准备好供
subprocess.Popen
使用。
编辑
这是我们应用程序的支柱。它非常常见,我们有一个单一的模型,具有多个表单,每个表单都是运行特殊批处理命令的特定方式。模型非常通用。表单是构建模型对象的特定方式。这就是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()
方法保存模型实例。我们执行保存操作是为了创建一个准确记录所执行操作的日志。