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中使用pprint函数进行格式化输出的教程
Apr 07 Python
python在控制台输出进度条的方法
Jun 20 Python
使用Python编写基于DHT协议的BT资源爬虫
Mar 19 Python
Django1.7+python 2.78+pycharm配置mysql数据库
Oct 09 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
python获取酷狗音乐top500的下载地址 MP3格式
Apr 17 Python
pthon贪吃蛇游戏详细代码
Jan 27 Python
使用python读取.text文件特定行的数据方法
Jan 28 Python
使用python打印十行杨辉三角过程详解
Jul 10 Python
Python 用matplotlib画以时间日期为x轴的图像
Aug 06 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
Oct 21 Python
Pytorch对Himmelblau函数的优化详解
Feb 29 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
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
PHP 绘制网站登录首页图片验证码
2016/04/12 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
wordpress之js库集合研究介绍
2007/08/17 Javascript
将CKfinder整合进CKEditor3.0的新方法
2010/01/10 Javascript
js中更短的 Array 类型转换
2011/10/30 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
javascript动态添加删除tabs标签的方法
2015/07/06 Javascript
js运动应用实例解析
2015/12/28 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
详解vue父子模版嵌套案例
2017/03/04 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
vue 点击按钮增加一行的方法
2018/09/07 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
详解微信小程序网络请求接口封装实例
2019/05/02 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
Python pass详细介绍及实例代码
2016/11/24 Python
详解django三种文件下载方式
2018/04/06 Python
对Pandas MultiIndex(多重索引)详解
2018/11/16 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
基于python3实现倒叙字符串
2020/02/18 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
优秀团员个人事迹材料
2014/01/29 职场文书
房屋买卖委托公证书
2014/04/08 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
舞出我人生观后感
2015/06/16 职场文书
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python
MySQL transaction事务安全示例讲解
2022/06/21 MySQL