pythonmanage.pyrunserver流程解析
这篇⽂章主要介绍了python manage.py runserver流程解析,⽂中通过⽰例代码介绍的⾮常详细,对⼤家的学习或者⼯作具有⼀定的参考学习价值,需要的朋友可以参考下
版本
python27
django 1.0
搭建可运⾏的环境
创建python27 虚拟环境
github 下载 django-1.(1.0 版本的django)
解压
可以看到,有个 demo 在 examples ⽬录
把 django ⽬录拷贝到 examples 下⾯,这样 example 可以正确导⼊ django1.0
启动项⽬
python manage.py runserver
项⽬启动成功,可以修改代码来跟踪执⾏流程
流程
以下代码存在删减,主要展⽰代码流程
从 manage.py 开始,执⾏了 execute_manager ⽅法,传⼊ settings 模块
execute_manager(settings)
def execute_manager(settings_mod, argv=None):
# setup_environ 函数,只是设置了环境变量,执⾏配置模块
# os.environ['DJANGO_SETTINGS_MODULE'] = examples.settting
setup_environ(settings_mod)
# admin manage ⼯具类
utility = ManagementUtility(argv)
ManagementUtility 类
class ManagementUtility(object):
def __init__(self, argv=None):
# 初始化,例如
self.argv = ['.../examples/manage.py', 'runserver']
self.prog_name = 'manage.py'
def execute(self):
# 删除了部分代码,最终执⾏代码⼤致如下
# 这是⼀个命令⾏⼯具类,表名能接受什么样的参数,这⾥主要检查两个参数
# --settings 指定配置⽂件
# --pythonpath 执⾏ python 环境变量
parser = LaxOptionParser(usage="%prog subcommand [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)
django项目实例# fetch_command
# fetch_command 分析在下边
# fetch_command 返回 anagementmands.runserver.Command
# run_from_argv
# run_from_argv 分析在下边
self.fetch_command(subcommand).run_from_argv(self.argv)
def fetch_command(self, subcommand):
# get_commands
# get_commands 返回 anagementmands ⽬录下的所有模块,每个模块处理对应的参数    # 每个模块的值都是 ,app_name = ''
app_name = get_commands()[subcommand]
# load_command_class ⽅法
# 返回了 anagementmands.runserver.Command
klass = load_command_class(app_name, subcommand)
return klass
run_from_argv ⽅法
# anagementmands.runserver.Command
# 继承 anagement.base import BaseCommand
# run_from_argv 也是继承的
def run_from_argv(self, argv):
# 调⽤ execute
def execute(self, *args, **options):
# 调⽤ handle
# 注意 handle 被重写了
# 调⽤的是 anagementmands.runserver.Command.handle
output = self.handle(*args, **options)
handle
def handle(self, addrport='', *args, **options):
def inner_run():
# WSGI 处理程序
# WSGIHandler 可调⽤,是 WSGI 处理程序
# AdminMediaHandler 是对 WSGIHandler 的封装
# AdminMediaHandler 特殊处理媒体⽂件请求
# AdminMediaHandler ⾮媒体⽂件的 HTTP 请求,直接返回 WSGIHandler
handler = AdminMediaHandler(WSGIHandler(), path)
#
run(addr, int(port), handler)
# run 在 servers.basehttp.run
# run 定义如下
# run 启动了 HTTP 服务,这个服务器只能⽤于开发调试
def run(addr, port, wsgi_handler):
# 绑定地址端⼝
server_address = (addr, port)
# 服务实例
httpd = WSGIServer(server_address, WSGIRequestHandler)
# 传⼊ WSGI 处理程序
httpd.set_app(wsgi_handler)
# 监听请求
httpd.serve_forever()
inner_run()
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。