Django源码解析之CLI模块解析

154 阅读2分钟

Django 作为常用的 Python Web 的开发框架之一, 分析学习其源码对于使用者来说, 不仅可以提升对 Django 框架的掌握程度,方便在出现错误的时候进行定位, 还能够在开发过程中更优雅的完成对一些需求的设计和实现。

《Django源码解析》系列将会对 Django 的一些常用/核心功能的代码进行解析, 希望对各位有所帮助。

  • 解析的 Django 版本为 3.2.4
  • Python 版本为 3.6

Django CLI

Django CLI(Command Line Interface)提供了常用管理命令的命令行功能,包括但不限于完整的项目检查、启动 Django 应用、修改指定用户的密码。无论是使用django-admin还是python manage.py [subcommand], 都是通过django.core.management.execute_from_command_line作为统一的 CLI 入口。

  • 该 CLI 模块通过 argparse 标准库实现。
  • 针对命令行的自动补全插件, Django CLI 在运行时, 会根据环境变量自动退出, 而不会执行。

流程图

Django-CLI流程图

解析并执行命令的具体流程

  1. 首先会初始化django.core.management.ManagementUtility这个类, 在初始化时, 主要是把命令行的参数从sys.argv存储到ManagementUtility的实例中(self.argv), 并且将设置当前程序的名称(prog_name)

    CLI初始化代码块
  2. 预处理传入的 settings 和 pythonpath 参数: 设置当前项目使用的 setting 文件, 并且将传入的 pythonpath 加入到 python 检索模块的检索路径列表中。 预处理处理默认值

  3. 尝试加载配置文件中的 INSTALLED_APPS 变量, 做这一步的主要目的, 是为了确认当前运行时所使用的配置文件, 不论是通过--settings指定还是默认的,是否有效检查配置文件

    • Django的配置文件采用的是懒加载机制, 具体实现方式之后再讲
  4. 如果配置文件初始化完毕, 则会调用django.setup()去启动 django, 在这期间会配置日志信息、 设置 URL 前缀、 同时将配置文件中配置的 INSTALLED_APPS 注册并引入到当前的 django 应用中。启动django

  5. 特殊处理 help 子命令,同时对django-admin --help/--version作兼容性的调整。

  6. 加载所有支持的子命令,先从django.core.management.commands中加载核心的子命令,如果配置文件有效, 则加载 INSTALLED_APP 配置项里支持的子命令。

    • 找子命令的逻辑是: 从 APP 的路径往下找management/commands, 然后通过pkgutil包把所有不是文件夹的模块全部返回回来
  7. 在找到的子命令字典中, 匹配输入的子命令, 如果有完全匹配的, 则加载并实例化该命令类, 并且执行run_from_argv方法。