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使用urllib模块和pyquery实现阿里巴巴排名查询
Jan 16 Python
Python中random模块生成随机数详解
Mar 10 Python
用Python解决计数原理问题的方法
Aug 04 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
May 31 Python
python selenium UI自动化解决验证码的4种方法
Jan 05 Python
Python实现朴素贝叶斯分类器的方法详解
Jul 04 Python
Python wxPython库消息对话框MessageDialog用法示例
Sep 03 Python
python 画3维轨迹图并进行比较的实例
Dec 06 Python
浅谈pymysql查询语句中带有in时传递参数的问题
Jun 05 Python
python + selenium 刷B站播放量的实例代码
Jun 12 Python
python time.strptime格式化实例详解
Feb 03 Python
Python爬虫+Tkinter制作一个翻译软件的示例
Feb 20 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处理json格式数据经典案例总结
2016/05/19 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
Javascript加载速度慢的解决方案
2014/03/11 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
vue-router路由懒加载和权限控制详解
2017/12/13 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
javaScript产生随机数的用法小结
2018/04/21 Javascript
详解vue-loader在项目中是如何配置的
2018/06/04 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
vue设置默认首页的操作
2020/08/12 Javascript
python 调用win32pai 操作cmd的方法
2017/05/28 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
实例详解Python装饰器与闭包
2019/07/29 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
体育教育专业毕业生自荐信
2013/11/15 职场文书
干部下基层实施方案
2014/03/14 职场文书
2014年社区党建工作总结
2014/11/11 职场文书
革命电影观后感
2015/06/18 职场文书
用人单位的规章制度,怎样制定才是有效的?
2019/07/09 职场文书
MySQL 8.0 之不可见列的基本操作
2021/05/20 MySQL
详细了解MVC+proxy
2021/07/09 Java/Android