Django1.8 django-admin和manage命令簡要分析

startproject和startapp

建立一個項目(Project)

Django使用django-admin startproject [projectname]命令生成project。 
django-admin命令行的路徑爲:django/bin/django-admin.py 
以django-admin startproject mysite爲例,這將會在當前目錄下生成一個mysite目錄,目錄結構以下: html

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

建立一個應用(App)

在project中與manage.py相同的目錄下使用python manage.py startapp [appname]命令生成app。 
以python manage.py startapp polls爲例,這將建立一個目錄polls,目錄結構以下: python

polls/
    __init__.py
    admin.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

django-admin.py與manage.py工做原理

django-admin.py源碼: git

#!/usr/bin/env python
from django.core import management

if __name__ == "__main__":
    management.execute_from_command_line()

manage.py源碼: github

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

它們都用到了django.core.management這個模塊的execute_from_command_line方法。 
主要的區別是manage.py比django-admin.py多了一行: 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") 
用來設置DJANGO_SETTINGS_MODULE這個環境變量爲當前項目的settings文件。 django

命令執行過程分析

經過execute_from_command_line()方法,能夠看到Django命令主要是經過 
django.core.management.ManagementUtility類的入口execute()執行。 app

命令執行過程以下: fetch

  1. 解析命令,得到要執行的子命令名稱(如startapp)。 
    subcommand = self.argv[1]
  2. 找出subcommand的完整路徑 
    self.fetch_command(subcommand) 
    其中fetch_command調用get_commands從下面幾個地方找命令:
    • django/core/management/commands目錄下的命令文件
    • project//management/commands/目錄下的命令文件
  3. 根據返回的subcommand實例,執行run_from_argv()方法: 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    從django.core.management.base.BaseCommand中可知run_from_argv()方法的調用過程: 
    run_from_argv() -> execute() -> handle()
    handle()方法執行的結果就是最後的返回。

Command命令

在django/core/management/commands能夠查看因此的系統命令。 ui

startproject.py和startapp.py都是調用django.core.management.templates.TemplateCommand類的handle()方法進行處理。 
二者主要的區別是:template_dir不一樣 url

  • project的template目錄:django.conf.project_template
  • app的template目錄:django.conf.app_template

參考

相關文章
相關標籤/搜索