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算法学习之计数排序实例
Dec 18 Python
Python验证码识别的方法
Jul 10 Python
在python3.5中使用OpenCV的实例讲解
Apr 02 Python
Python读取指定日期邮件的实例
Feb 01 Python
对python 调用类属性的方法详解
Jul 02 Python
MNIST数据集转化为二维图片的实现示例
Jan 10 Python
python json.dumps() json.dump()的区别详解
Jul 14 Python
Python在字符串中处理html和xml的方法
Jul 31 Python
python的数学算法函数及公式用法
Nov 18 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
Jan 29 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 Python
python中取整数的几种方法
Nov 07 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
wordpress自定义url参数实现路由功能的代码示例
2013/11/28 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
2015/12/22 PHP
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
jquery获取节点名称
2015/04/26 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
JS实现动态生成表格并提交表格数据向后端
2020/11/25 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
jQuery模拟窗口抖动效果
2017/03/15 Javascript
详解webpack es6 to es5支持配置
2017/05/04 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
JavaScript中创建原子的方法总结
2018/08/26 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
2019/02/26 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
Python-基础-入门 简介
2014/08/09 Python
python实现图片处理和特征提取详解
2017/11/13 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
Python中利用aiohttp制作异步爬虫及简单应用
2018/11/29 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
Python Web版语音合成实例详解
2019/07/16 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
2020/02/14 Python
在服务器上安装python3.8.2环境的教程详解
2020/04/26 Python
使用Keras 实现查看model weights .h5 文件的内容
2020/06/09 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
华为俄罗斯官方网上商城:购买Huawei手机和平板
2017/04/21 全球购物
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
毕业生就业自荐书
2013/12/15 职场文书
海上钢琴师观后感
2015/06/03 职场文书
离职信范文
2015/06/23 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书