文档章节

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

donhui
 donhui
发布于 2015/11/23 17:25
字数 478
阅读 1497
收藏 5

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()执行。

命令执行过程如下:

  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可以查看所以的系统命令。

startproject.py和startapp.py都是调用django.core.management.templates.TemplateCommand类的handle()方法进行处理。 
两者主要的区别是:template_dir不同

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

参考

© 著作权归作者所有

donhui

donhui

粉丝 51
博文 88
码字总数 42327
作品 2
杭州
其他
私信 提问
加载中

评论(3)

江湖一哥
有用
胡小子
1111
笔阁
笔阁
写过一个django的文章,感兴趣的可以看看。
http://my.oschina.net/u/2275217/blog/528331
django零开始

安装。。。后查看 import django django.VERSION #输出版本号,目前自己是py2.7.9和django1.8 1,新建一个django-project django-admin.py startproject project-name 一个project一般为一个...

天马行空的鱼
2016/01/05
45
0
django web开发指南 (参照)

环境:win10x64 已经安装python2.7,django1.8 已经配置环境变量等 django-admin.exe startproject test5 cd test5 创建应用 python manage.py startapp blog 进入mysite目录修改settings.py......

anaf
2016/01/19
0
0
Python web 框架 - Django入门

一、Django简介 Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的框架模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网...

乌龟漫步
2017/10/13
0
0
基于Django1.10与Celery4实现异步队列任务

由于django-celery这个模块我在django1.10的版本内运行不起来,只能使用野生的Celery,Celery4支持django1.8以上的版本,1.8以下的版本请使用Celery3,整个配置过程并不复杂: 整个目录结构:...

lihuipeng
2017/01/20
0
0
【django系列学习笔记】 常用命令汇总

项目相关 ----------------------------------------- 1. 新建一个 django-project django-admin.py startproject project-name 2. 新建 app python manage.py startapp app-name django-ad......

北方攻城师
2015/10/25
93
0

没有更多内容

加载失败,请刷新页面

加载更多

CQRS与AXON

CQRS 看了蛮多文章,只会CRUD,却不懂CQRS,CQRS是遵循DDD思想而产生的一种模式,Command and Query Responsibility Segregation 命令与查询隔离。查询就直接通过正常的模式service调dao层。...

无极之岚
25分钟前
2
0
OSChina 周三乱弹 —— 欢迎你来做产品经理

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :10多次劲歌金曲获奖,更多叱咤歌坛排名,黎明才应该是四大天王之首,只可惜拍的电影太少。单曲循环一个多月的歌,力荐 《无名份的...

小小编辑
40分钟前
74
5
500行代码,教你用python写个微信飞机大战

这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。 帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!...

上海小胖
今天
8
0
关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部