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命令行参数sys.argv使用示例
Jan 28 Python
详解Python的迭代器、生成器以及相关的itertools包
Apr 02 Python
Python操作Excel之xlsx文件
Mar 24 Python
TensorFlow实现卷积神经网络
May 24 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
Jun 24 Python
使用python实现简单五子棋游戏
Jun 18 Python
使用Python画出小人发射爱心的代码
Nov 23 Python
python3 使用traceback定位异常实例
Mar 09 Python
python实现猜单词游戏
May 22 Python
基于Keras的格式化输出Loss实现方式
Jun 17 Python
python 识别登录验证码图片功能的实现代码(完整代码)
Jul 03 Python
Python matplotlib绘制雷达图
Apr 13 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
提取HTML标签
2006/10/09 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
2016/12/24 PHP
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
jQuery插件FusionCharts绘制的2D条状图效果【附demo源码】
2017/05/13 jQuery
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
Node.js 8 中的重要新特性
2017/06/28 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
微信小程序开发之自定义tabBar的实现
2018/09/06 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
angular 表单验证器验证的同时限制输入的实现
2019/04/11 Javascript
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
Vue实现多页签组件
2021/01/14 Vue.js
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
python中zip()方法应用实例分析
2016/04/16 Python
python实现自动解数独小程序
2019/01/21 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
Pytorch 多维数组运算过程的索引处理方式
2019/12/27 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
Python生成器传参数及返回值原理解析
2020/07/22 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
类成员函数的重载、覆盖和隐藏区别
2016/01/27 面试题
初中生物教学反思
2014/01/10 职场文书
餐厅筹备计划书
2014/04/25 职场文书
学生会竞选演讲稿学习部
2014/08/25 职场文书
SQL 窗口函数实现高效分页查询的案例分析
2021/05/21 SQL Server
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js