1. 程式人生 > 實用技巧 >django python mange.py runserver 原始碼

django python mange.py runserver 原始碼

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 啟動的核心