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中特殊函数集锦
Jul 27 Python
Python字符串、元组、列表、字典互相转换的方法
Jan 23 Python
Python实现带百分比的进度条
Jun 28 Python
使用python绘制常用的图表
Aug 27 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
Feb 01 Python
python实现将excel文件转化成CSV格式
Mar 22 Python
Python实现base64编码的图片保存到本地功能示例
Jun 22 Python
Python中常用的内置方法
Jan 28 Python
python实践项目之监控当前联网状态详情
May 23 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 Python
Django 允许局域网中的机器访问你的主机操作
May 13 Python
关于 Python json中load和loads区别
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
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
Yii2中SqlDataProvider用法示例
2016/09/22 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
2019/05/09 PHP
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
jQuery Validate 验证,校验规则写在控件中的具体实例
2014/02/27 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
Vue+ElementUI table实现表格分页
2019/12/14 Javascript
Vue如何将页面导出成PDF文件
2020/08/17 Javascript
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
2016/06/26 Python
Python中标准模块importlib详解
2017/04/16 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
python实现学生管理系统
2018/01/11 Python
Python中最大递归深度值的探讨
2019/03/05 Python
PYTHON发送邮件YAGMAIL的简单实现解析
2019/10/28 Python
python统计字符的个数代码实例
2020/02/07 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
办公设备采购方案
2014/03/16 职场文书
最美家庭活动方案
2014/08/31 职场文书
婚前保证书范文
2015/02/28 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
如何开发一个渐进式Web应用程序PWA
2021/05/10 Javascript
详解Python类和对象内容
2021/06/22 Python
Python 中面向接口编程
2022/05/20 Python