Django源码-startproject
Django的所有命令都位于django/django/core/management/commands/
目录下
一 命令目录
django-admin startproject project_name
这个命令在源码里面没有单独的文件;django在安装的时候直接安装到了bin/django-admin
。
我们在django源码里面django/
下创建django-admin.py
,把软件目录的代码拷贝过来使用。
#!/home/chen/.virtualenvs/DjangoSource/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from django.core.management import execute_from_command_line # 这里要确保进入的不是安装好的django而是进入源码里面
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(execute_from_command_line())
二 创建项目
-
在django源码的上层目录创建项目,把django当作模块来使用
-
django-admin starproject demo
三 查看执行过程
-
django-admin.py
-
ManagementUtility对象
-
startproject.Command对象
-
Command.handle
-
执行创建项目
-
startproject.Command类的继承关系
四 过程描述
创建工程命令时在django-admin中开始的,在Django4中这个命令直接安装在解释器的bin中作为shell命令使用,而不是在源码中。django-admin starproject的作用是创建一个工程,他调用的是django源码中的managemen中的函数创建ManagementUtility对象并调用execute方法,在这个方法中他获取和初步校验命令参数,并做一些参数设置,在这个方法的最重要的是在最后根据参数创建了一个startproject的Command对象,这个startproject中的Command类继承自TemplateCommand和base中的BaseCommand,他的最终结果就是调用Command对象的handle方法根据模板文件去创建项目。在handle方法里先os.getcwd()获取当前目录+项目名作为顶层目录,或者你可以指定目录。接着就是os.walk(template_dir)遍历django.conf目录下的project模板,django用自身的模板引擎替换掉模板中的变量后用with open写入内容。这是django创建项目的基本过程。根据源码你还可以看到一些不常用的参数,像--template,--name等参数
五 疑问和收获
-
pycharm有几个地方标错
海象运算符和旧版pycharm不兼容
-
os.getcwd
返回当前进程的工作目录
-
os.walk
用于通过在目录树中游走输出在目录中的文件名
os.walk(top[, topdown=True[, one rror=None[, followlinks=False]]])
-
top -- 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。
- root 所指的是当前正在遍历的这个文件夹的本身的地址
- dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
- files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
-
topdown --可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。
-
onerror -- 可选,需要一个 callable 对象,当 walk 需要异常时,会调用。
-
followlinks -- 可选,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录
-