锁定老帖子 主题:django源代码分析二 一起从命令行说起
精华帖 (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下我们发现了大量的命令行对象
继续看这样代码 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的系统的整体设计。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 3449 次