论坛首页 编程语言技术论坛

django源代码分析二 一起从命令行说起

浏览 3448 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-20  

   牵头万绪从何说起。这次阅读代码我们采用从点到面得方式来阅读。所谓的从点到面是指找到一个突破点,深入进去可以看到整体的结构。(关于源代码的阅读方式可以写的更多,这里暂且只说这一种。)这些阅读代码的方式都是我自己积累的一些小心得,如果你有更好的办法当然可以按照你的爱好来。

   对于django来说的突破点是命令行下的django-admin.py,打开它,我们可以看到源代码非常少(django现在的源代码比起以前的版本更加的清晰了,这也是我再次回头研究它的原因。)不难发现关于命令行下所有的按钮都有django.core.management文件来实现。这个文件中主要包括了LaxOptionParser、ManagementUtility这两个对象,ManagementUtility的execute方法(272行)是实际对命令参数的解析

  parser = LaxOptionParser(usage="%prog subcommand [options] [args]",
                                 version=get_version(),
                                 option_list=BaseCommand.option_list)

 这里可以看到LaxOptionParser是实际对命令行的解析,我们发现该对象继承了OptionParser对象,OptionParser是python内置的一个库用来进行命令行的解析。需要进行命令行解析的朋友不妨仔细研究一下这些。

我们回头继续看ManagementUtility.execute的289行

self.fetch_command(args[2]).print_help(self.prog_name, args[2])

 这里调用ManagementUtility.fetch_command方法,该方法是实际执行命令的操作,该方法的257行调用了load_command_class,跟进看到load_command_class的代码

def load_command_class(app_name, name):
    module = import_module('%s.management.commands.%s' % (app_name, name))
    return module.Command()

 终于到头了,在这里我们发现它根据传递过来的参数来import_module一个对象,然后执行。

在django.core.management.commands下我们发现了大量的命令行对象



 是否眼熟?每当我们执行manage.py runserver的时候其实是调用这里的runserver.py文件中的对象。这里是一个command模式。这个模式在python中有了一种特殊的形态,大家不妨细细体会一把。

继续看这样代码

def load_command_class(app_name, name):
    module = import_module('%s.management.commands.%s' % (app_name, name))
    return module.Command()

 这里有一个app_name,也就是说我们可以自定义自己的commoand,具体代码可以分析get_commands中的101行和116行

apps = settings.INSTALLED_APPS
 
path = find_management_module(app_name)

 这里我们发现app_name是在settings.py中的INSTALLED_APPS定义的。比如我的

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
	'blog',
)

 然后在我的blog目录下



 

这里我实现了自己定义的一个mycommand.py,里面没有任何代码,执行manage.py mycommand,会提示我们一个异常错误,原因是因为我们没有写Command对象。

 

到此为止命令行的分析我们已经告一段落了,这里只是大概的分析,细节留给大家自己慢慢品味,毕竟主动获取的知识比灌输的更加可靠。

 

下一节我们开始进入正题,进入djang的http server处理流程一窥django的系统的整体设计。

 

  • 大小: 28.6 KB
  • 大小: 2.8 KB
  • 大小: 12 KB
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics