python manage.py runserver流程解析


Posted in Python onNovember 08, 2019

这篇文章主要介绍了python manage.py runserver流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

版本

  • python27
  • django 1.0

搭建可运行的环境

创建python27 虚拟环境

github 下载 django-1.0.tar.gz(1.0 版本的django)

解压

可以看到,有个 demo 在 examples 目录

把 django 目录拷贝到 examples 下面,这样 example 可以正确导入 django1.0

启动项目

python manage.py runserver

项目启动成功,可以修改代码来跟踪执行流程

流程

以下代码存在删减,主要展示代码流程

从 manage.py 开始,执行了 execute_manager 方法,传入 settings 模块

execute_manager(settings)

django.core.management.execute_manager 方法

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)
  utility.execute()

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)
  
    # 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)
  
  def fetch_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)
  
    return klass

run_from_argv 方法

# django.core.management.commands.runserver.Command 
# 继承 django.core.management.base import BaseCommand
# run_from_argv 也是继承的
def run_from_argv(self, argv):
  # 调用 execute
  self.execute(*args, **options.__dict__)

def execute(self, *args, **options):
  # 调用 handle
  # 注意 handle 被重写了
  # 调用的是 django.core.management.commands.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 在 django.core.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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现在无须过多援引的情况下创建字典的方法
Sep 25 Python
Python中title()方法的使用简介
May 20 Python
Python字符串匹配算法KMP实例
Jul 18 Python
使用Python编写简单的画图板程序的示例教程
Dec 08 Python
Python如何实现MySQL实例初始化详解
Nov 06 Python
Python语言描述KNN算法与Kd树
Dec 13 Python
Python for循环生成列表的实例
Jun 15 Python
Python调用C语言的实现
Jul 26 Python
python下载库的步骤方法
Oct 12 Python
Python面向对象程序设计之继承、多态原理与用法详解
Mar 23 Python
Django中F函数的使用示例代码详解
Jul 06 Python
python脚本第一行如何写
Aug 30 Python
详解python中docx库的安装过程
Nov 08 #Python
numpy.array 操作使用简单总结
Nov 08 #Python
如何在python中写hive脚本
Nov 08 #Python
Python 依赖库太多了该如何管理
Nov 08 #Python
python+OpenCV实现车牌号码识别
Nov 08 #Python
python实现飞机大战小游戏
Nov 08 #Python
python 基于dlib库的人脸检测的实现
Nov 08 #Python
You might like
PHP中的日期及时间
2006/11/23 PHP
PHP 面向对象详解
2012/09/13 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
解决nginx不支持thinkphp中pathinfo的问题
2015/07/21 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
JQuery从头学起第三讲
2010/07/06 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
JS 实现 ajax 异步浏览器兼容问题
2017/01/21 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
vue2.0基于vue-cli+element-ui制作树形treeTable
2019/04/30 Javascript
微信小程序实现点击空白隐藏的方法示例
2019/08/13 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
移动通信行业实习自我鉴定
2013/09/28 职场文书
澳大利亚商务邀请函
2014/01/17 职场文书
中秋节超市促销方案
2014/01/30 职场文书
土地转让协议书
2014/04/15 职场文书
工会换届选举方案
2014/05/21 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
先进教师个人总结
2015/02/11 职场文书
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA