创建项目 django-admin startproject
假设系统已安装django2.2
在安装完成 django 后,在命令行下执行以下命令,创建项目名称为"project":
django-admin startproject project
Django 会在当位置下创建 project 目录:(tree 命令需要单独安装)
首先,通过 whereis 查找 django-admin 命令所在位置
whereis django-admin
通过 vim/vi 打开 django-admin 程序文件。通过文件,可以发现django-admin 是引入并执行"django.core.management" 包内的 execute_from_command_line 方法
打开django2.2 源码并找到 “django/core/management/init.py”, 在该文件的结尾处可以发现 “execute_from_command_line()” 函数的定义。
根据这个函数,我们就可以继续向下寻找django 在运行 startproject 命令时,到底为我们做了哪些工作。
从上至下,主要调用的类与方法(只按正常情况列出,其它逻辑分支未列出)
$django/core/management/__ init__.py
1. def execute_from_command_line() #$django/core/management/__ init__.py
2. class ManagementUtility: #$django/core/management/__ init__.py
def execute()
def fetch_command() #返回当前命令所指向的对象,如对象未实例化,则调用函数 load_command_class(app_name, subcommand) 创建新对象。
def load_command_class() #根据传入参数,载入 $django/core/management/commands/xxxx.py 对应模块文件
3.# $django/core/management/commands 目录下存放默认django-admin 支持的所有命令操作程序,当前分析的是 startproject , 打开 startproject.py 文件,即可看到该命令到底做了哪些操作。
$django/core/management/commands/startproject.py
部分代码
class Command(TemplateCommand):
help = (
"Creates a Django project directory structure for the given project "
"name in the current directory or optionally in the given directory."
)
missing_args_message = "You must provide a project name."
def handle(self, **options):
project_name = options.pop('name')
target = options.pop('directory')
# Create a random SECRET_KEY to put it in the main settings.
options['secret_key'] = get_random_secret_key()
#调用父类 TemplateCommand.handle()方法
#该方法主要用途是基于 $django/conf/project_template 目录下的*.py-tpl 文件与子目录,生成我们想要创建的初始化项目文件结构。如想自定制django-admin 默认创建项目结构与文件初始化代码,可以在这个目录下修改。
#$django/core/management/templates.py
super().handle('project', project_name, target, **options)
创建项目初始化模板目录结构,
1.初始化项目资源位置 $django/conf/project_template
2.初始化应用资源位置 $django/conf/app_template
先写这么多,有时间再详细分析