这次从头看起。
---
从项目的manage.py看,只有execute_from_command_line(sys.argv)这一个,sys.argv后边看到传不传一样。在django/core/management/__init__.py最后,ManagementUtility对象初始化,保存命令参数和项目路径。execute前边进行参数的解析,设置参数,最后一行 self.fetch_command(subcommand).run_from_argv(self.argv)
这个功能是执行相应的命令。
---
先看fetch_command(),里边get_commands,取得django自带的命令和用户项目写的命令,返回map{命令:app_name},django自带目录的是django/core/management/commands,app_name为django.core。还要过滤目录下的__init__.py。。。
下一步在fetch_command通过返回的字典获得app_name,下边就是根据app_name导入command。django通过判断app_name有没有BaseCommand来确定是否已经导入command模块(命令命名的py文件),如果没有导入,导入并返回里边的Command类就是定义的命令。最后返回Command类。
----
下边调用run_from_argv方法,这个Command类是集成BaseCommand,在django/core/management/__init__.py里边,先设置参数然后到execute里边。self.validate()model的定义检查等。然后执行了handler()就是命令的逻辑函数了。最后就是输出结果,有一个output_transaction,应该是操作数据库进行的操作,如查看数据表结构,后边看,看是数据库操作。
----
然后就是找到你想看的命令对应的文件看了。先看runserver了,其他先不看。
django/core/management/commands/runserver.py,handler(),先判断了DEBUG为false时,必须设置ALLOWED_HOSTS。然后ipv6的一坨,没看。
到了run(),只区分是否自动重载代码,不想自动加载要命令后边加上--noreload。然后只看自动重载的代码autoreload.main(self.inner_run, args, options),不过也要用到self.inner_run。。。
----
/django/utils/autoreload.py,main(),里边通过判断sys.platform开始字符串是‘java'选择使用哪个reloader。。没研究过jython,长知识。check_errors捕获执行inner_run时的异常。下边就是reload了,没看懂,等后边详细看看。
----
回到inner_run,开始打印了一堆提示信息。到get_handler里边返回get_internal_wsgi_application().
django/core/servers/basehttp.py,get_internal_wsgi_application,,判断settings里边是否设置WSGI_APPLICATION,默认设置,在项目里wsgi.py.
如果没设置,找get_wsgi_application,设置了导入wsgi.py,返回application,而application也是get_wsgi_application.
get_wsgi_application返回WSGIHandler(),/django/core/handlers/wsig.py,处理请求的逻辑在这里开始了。以后分析。
inner_run最后run(),WSGIServer继承自wsgiref.simple_server.WSGIServer。初始化传入,addr,wsgi_handler(刚刚返回的处理请求的逻辑!,后边用set_app设置),ipv6的。
-----
下边主要想看一下reload是怎么做的(纯属好奇)和WSGIHandle(最终目的!)
上一篇: ruby交互模式工具pry
下一篇: django源码阅读-reload代码自动重载
0 Responses so far.