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 常用string函数(收藏)
May 30 Python
Python实现求两个csv文件交集的方法
Sep 06 Python
Python编程实现的简单神经网络算法示例
Jan 26 Python
python制作抖音代码舞
Apr 07 Python
python文件选择对话框的操作方法
Jun 27 Python
Python实现变声器功能(萝莉音御姐音)
Dec 05 Python
python集合能干吗
Jul 19 Python
python闭包与引用以及需要注意的陷阱
Sep 18 Python
python和C++共享内存传输图像的示例
Oct 27 Python
Python Process创建进程的2种方法详解
Jan 25 Python
Python 如何将integer转化为罗马数(3999以内)
Jun 05 Python
python 安全地删除列表元素的方法
Mar 16 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调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
PHP实现远程下载文件到本地
2015/05/17 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
2014/06/13 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
javascript arguments使用示例
2014/12/16 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
深入探讨Vue.js组件和组件通信
2016/09/12 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
2017/08/18 Javascript
vue项目中使用fetch的实现方法
2019/04/25 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
2019/05/09 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
用webpack4开发小程序的实现方法
2019/06/04 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
2020/08/24 Javascript
一个超级简单的python web程序
2014/09/11 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
Python基于csv模块实现读取与写入csv数据的方法
2018/01/18 Python
python生成带有表格的图片实例
2019/02/03 Python
python开发前景如何
2020/06/11 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
HTML5中的网络存储实现方式
2020/04/28 HTML / CSS
软件测试常见笔试题
2012/02/04 面试题
热能动力工程毕业生自荐信
2013/11/07 职场文书
县长“四风”对照检查材料思想汇报
2014/10/05 职场文书
关于 Python json中load和loads区别
2021/11/07 Python