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
在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源码: 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
在django/core/management/commands能够查看因此的系统命令。 ui
startproject.py和startapp.py都是调用django.core.management.templates.TemplateCommand类的handle()方法进行处理。
二者主要的区别是:template_dir不一样 url