瓶的flask_script和经理的深入理解

  

@TOC
烧瓶中经理源码如下所示:

  
 <代码>类经理(对象):
  ”“”
  控制器类来处理的一组命令。
  
  典型的用法::
  
  类打印(命令):
  
  def运行(自我):
  打印“你好”
  
  应用=瓶(__name__)
  
  经理=经理(应用)
  经理。add_command(“打印”,print ())
  
  if __name__==癬_main__”:
  manager.run ()
  
  ,
  dest=参数,
  要求=False,
  默认=默认))
  其他:
  选项。追加(选项(arg”——% s ' % [0],
  的——% s %参数,
  dest=参数,
  类型=text_type,
  要求=False,
  默认=默认))
  
  其他:
  选项。追加(选项(参数、类型=text_type))
  
  self.run=函数
  自我。__doc__=func.__doc__
  自我。option_list=选项
  
  @ property
  def描述(自我):=自我描述。__doc__或“
  返回description.strip ()
  
  def add_option(自我,选择):
  ”“”
  添加选项,选项列表。
  ”“”
  self.option_list.append(选项)
  
  def get_options(自我):
  ”“”
  默认情况下,返回self.option_list。覆盖如果你
  需要做特定的配置。
  ”“”
  返回self.option_list
  
  def create_parser(自我,* args, * * kwargs):
  func_stack=kwargs.pop (func_stack, ())
  父=kwargs.pop(“父”,没有一个)
  解析器=argparse。ArgumentParser (* args, add_help=False, * * kwargs)
  help_args=self.help_args
  虽然help_args没有和家长不是没有:
  help_args=parent.help_args
  父=getattr(父母,“父”,没有一个)
  
  如果help_args:
  从flask_script进口add_help
  add_help(解析器,help_args)
  
  在self.get_options选项():
  如果isinstance(选项,组):
  如果option.exclusive:
  组=parser.add_mutually_exclusive_group (
  要求=option.required,
  )
  其他:
  组=parser.add_argument_group (
  标题=option.title,
  描述=option.description,
  )
  选择在option.get_options ():
  group.add_argument(*选择。args, * * opt.kwargs)
  其他:
  parser.add_argument(*选项。args, * * option.kwargs)
  
  parser.set_defaults (func_stack=func_stack +(自我))
  
  自我。解析器解析器=自我。父母=父
  返回解析器
  
  def __call__(自我,应用=None, * args, * * kwargs):
  ”“”
  处理与给定应用程序的命令。
  违约行为是叫‘self.run ' '在一个测试请求上下文中。
  ”“”
  与app.test_request_context ():
  返回self.run (* args, * * kwargs)
  
  def运行(自我):
  ”“”
  运行一个命令。这必须由子类实现。应该采取
  参数配置的命令选项。
  ”“”
  提高NotImplementedError  
  

下面分析下执行过程:
1,其他函数是对的选项(列表)的内容进行增删查操作
2, create_parser函数创建了命令行解析对象=argparse <代码>解析器。ArgumentParser (* args, add_help=False, * * kwargs)> parser.set_defaults (func_stack=func_stack +(自我))> 3,在瓶应用代码中我们添加例如<代码>经理。add_command(“数据库”,打印())>   

备注在祝辞祝辞在瓶应用代码中我们添加例如<代码>经理。MigrateCommand add_command (db) 的代码,传入了经理的实例对象MigrateCommand——————另外一个经理对象(此对象,已经添加了添加了迁移等命令,后面会和当前这个瓶应用中经理对象建立关联self.parent)
  

, <强>调用强方法中显示,当命令的实例对象被调用的时候,就会被执行(此时,引入应用实例的上下文,并执行了运行方法)。那么此时,我们就只要去寻找<代码>命令实例是何时被调用的

  

此时管理对象包装应用,并执行了自己的运行方法。如下所示。

  

运行方法中通过sys.argv接收了命令行参数,并把参数提交给<代码>通过。处理> 而处理方法中创建<代码> app_parser=self.create_parser(掠夺)(此函数获取到Commad对象),获取了所有的app_parser的信息(函数和参数和配置)。

  

解析器什么时候被执行吗?

  

此时而app_parser依然是argparse中<代码> ArgumentParser> 瓶的flask_script和经理的深入理解