python manage.py runserver流程解析
这篇文章主要介绍了pythonmanage.pyrunserver流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
版本
- python27
- django1.0
搭建可运行的环境
创建python27虚拟环境
github下载django-1.0.tar.gz(1.0版本的django)
解压
可以看到,有个demo在examples目录
把django目录拷贝到examples下面,这样example可以正确导入django1.0
启动项目
pythonmanage.pyrunserver
项目启动成功,可以修改代码来跟踪执行流程
流程
以下代码存在删减,主要展示代码流程
从manage.py开始,执行了execute_manager方法,传入settings模块
execute_manager(settings)
django.core.management.execute_manager方法
defexecute_manager(settings_mod,argv=None): #setup_environ函数,只是设置了环境变量,执行配置模块 #os.environ['DJANGO_SETTINGS_MODULE']=examples.settting setup_environ(settings_mod) #adminmanage工具类 utility=ManagementUtility(argv) utility.execute()
ManagementUtility类
classManagementUtility(object): def__init__(self,argv=None): #初始化,例如 self.argv=['.../examples/manage.py','runserver'] self.prog_name='manage.py' defexecute(self): #删除了部分代码,最终执行代码大致如下 #这是一个命令行工具类,表名能接受什么样的参数,这里主要检查两个参数 #--settings指定配置文件 #--pythonpath执行python环境变量 parser=LaxOptionParser(usage="%progsubcommand[options][args]", version=get_version(), option_list=BaseCommand.option_list) #使用命令行工具类解析命令行参数,也就是获取--settings和--pythonpath的参数值 options,args=parser.parse_args(self.argv) #如果--settings参数存在,会覆盖之前设置的os.environ['DJANGO_SETTINGS_MODULE'] #如果--pythonpath参数存在,会把指定路径添加到sys.path的第一位,优先从此处加载模块 handle_default_options(options) #fetch_command #fetch_command分析在下边 #fetch_command返回django.core.management.commands.runserver.Command #run_from_argv #run_from_argv分析在下边 self.fetch_command(subcommand).run_from_argv(self.argv) deffetch_command(self,subcommand): #get_commands #get_commands返回django.core.management.commands目录下的所有模块,每个模块处理对应的参数 #每个模块的值都是django.core,app_name='django.core' app_name=get_commands()[subcommand] #load_command_class方法 #返回了django.core.management.commands.runserver.Command klass=load_command_class(app_name,subcommand) returnklass
run_from_argv方法
#django.core.management.commands.runserver.Command #继承django.core.management.baseimportBaseCommand #run_from_argv也是继承的 defrun_from_argv(self,argv): #调用execute self.execute(*args,**options.__dict__) defexecute(self,*args,**options): #调用handle #注意handle被重写了 #调用的是django.core.management.commands.runserver.Command.handle output=self.handle(*args,**options)
handle
defhandle(self,addrport='',*args,**options): definner_run(): #WSGI处理程序 #WSGIHandler可调用,是WSGI处理程序 #AdminMediaHandler是对WSGIHandler的封装 #AdminMediaHandler特殊处理媒体文件请求 #AdminMediaHandler非媒体文件的HTTP请求,直接返回WSGIHandler handler=AdminMediaHandler(WSGIHandler(),path) # run(addr,int(port),handler) #run在django.core.servers.basehttp.run #run定义如下 #run启动了HTTP服务,这个服务器只能用于开发调试 defrun(addr,port,wsgi_handler): #绑定地址端口 server_address=(addr,port) #服务实例 httpd=WSGIServer(server_address,WSGIRequestHandler) #传入WSGI处理程序 httpd.set_app(wsgi_handler) #监听请求 httpd.serve_forever() inner_run()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。