startproject和startapp创建一个项目(Project) Django使用django-admin startproject [projectname]命令生成project。
django-admin命令行的路径为:django/bin/django-admin.py
以django-admin startproject mysite为例,这将会在当前目录下生成一个mysite目录,目录结构如下: - 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,目录结构如下: - polls/
- __init__.py
- admin.py
- migrations/
- __init__.py
- models.py
- tests.py
- views.py
复制代码
django-admin.py与manage.py工作原理django-admin.py源码: - #!/usr/bin/env python
- from django.core import management
- if __name__ == "__main__":
- management.execute_from_command_line()
复制代码manage.py源码: - #!/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文件。
命令执行过程分析通过execute_from_command_line()方法,可以看到Django命令主要是通过
django.core.management.ManagementUtility类的入口execute()执行。
命令执行过程如下: - 解析命令,获得要执行的子命令名称(如startapp)。
subcommand = self.argv[1] - 找出subcommand的完整路径
self.fetch_command(subcommand)
其中fetch_command调用get_commands从下面几个地方找命令:- django/core/management/commands目录下的命令文件
- project//management/commands/目录下的命令文件
- 根据返回的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可以查看所以的系统命令。 startproject.py和startapp.py都是调用django.core.management.templates.TemplateCommand类的handle()方法进行处理。
两者主要的区别是:template_dir不同 - project的template目录:django.conf.project_template
- app的template目录:django.conf.app_template
|