django python mange.py runserver 原始碼
阿新 • • 發佈:2020-06-24
django python mange.py runserver 原始碼
入 口
mange.py檔案
execute_from_command_line函式 輸入引數為['manage.py', 'runserve'] sys模組監聽命令列輸入 並將值放入argv
並執行
進入後 直接到達 django-core-mangement- __init__ 內
execute_from_command_line函式
執行後 ---ManagementUtility 例項化 並且執行了execute() 方法
其中 例項化ManagementUtility 目錄結構如下
例項化執行__init__
execute 執行 官方註釋為:
"""
Given the command-line arguments, figure out which subcommand is being
run, create a parser appropriate to that command, and run it.
"""
給定命令列引數,找出哪個子命令建立適合該命令的解析器,然後執行
來到fetch_command函式內 發現最終返回klass物件執行其run_from_argv方法 而當前klass物件經過了load_command_class 對映 為方便理解 後面我們再去看
klass 物件 執行 run_from_argv 如下
進入execute後
注意 handle 函式 會優先 執行當前物件的handle 沒有之後再去尋找父類handle
而我們當前物件為runserver的commands
之所以能對映到management.commmands.runserver.command 是之前提到了的load_command_class 做的對映
load_command_class 如下:
module = import_module('%s.management.commands.%s' % (app_name, name)) #其內部字串為 django.contrib.staticfiles.management.commands.runserver #提示import_module就是常用的importlib.import_module 即以字串型別的索引匯入類
我們按照路徑去到 runserver模組內部 發現內部如下
因為其內部並沒有handle 函式 所以我們進入其父類 尋找
我們進入core.management.command.runserver 找到了handle
進過上面的對映 我們終於找到了 runserver 下的handle 並執行run函式
但是並沒有看到我們希望的核心程式碼 經過列印我們知道 此時use_reloader =True 意味著我們執行
autoreload.run_with_reloader(self.inner_run, **options)
進入其內部
來到start_django 終於 終於` 我們看到了django 啟動的核心