51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1595|回复: 0

[原创] Django1.8 django-admin和manage命令简要分析

[复制链接]
  • TA的每日心情
    无聊
    2023-12-19 11:16
  • 签到天数: 40 天

    连续签到: 1 天

    [LV.5]测试团长

    发表于 2019-1-24 16:28:21 | 显示全部楼层 |阅读模式
    startproject和startapp创建一个项目(Project)

    Django使用django-admin startproject [projectname]命令生成project。
    django-admin命令行的路径为:django/bin/django-admin.py
    以django-admin startproject mysite为例,这将会在当前目录下生成一个mysite目录,目录结构如下:

    1. mysite/
    2.     manage.py
    3.     mysite/
    4.         __init__.py
    5.         settings.py
    6.         urls.py
    7.         wsgi.py
    复制代码

    创建一个应用(App)

    在project中与manage.py相同的目录下使用python manage.py startapp [appname]命令生成app。
    以python manage.py startapp polls为例,这将创建一个目录polls,目录结构如下:

    1. polls/
    2.     __init__.py
    3.     admin.py
    4.     migrations/
    5.         __init__.py
    6.     models.py
    7.     tests.py
    8.     views.py
    复制代码

    django-admin.py与manage.py工作原理

    django-admin.py源码:

    1. #!/usr/bin/env python
    2. from django.core import management

    3. if __name__ == "__main__":
    4.     management.execute_from_command_line()
    复制代码

    manage.py源码:

    1. #!/usr/bin/env python
    2. import os
    3. import sys

    4. if __name__ == "__main__":
    5.     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

    6.     from django.core.management import execute_from_command_line

    7.     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

    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-3-29 00:56 , Processed in 0.066668 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表