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 28 Python
Python利用BeautifulSoup解析Html的方法示例
Jul 30 Python
python selenium UI自动化解决验证码的4种方法
Jan 05 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
python学生信息管理系统(初级版)
Oct 17 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
Python利用神经网络解决非线性回归问题实例详解
Jul 19 Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 Python
Python如何测试stdout输出
Aug 10 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
python-jwt用户认证食用教学的实现方法
Jan 19 Python
利用Python网络爬虫爬取各大音乐评论的代码
Apr 13 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
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
2015/01/20 PHP
Laravel实现ORM带条件搜索分页
2019/10/24 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
ECMAScript6块级作用域及新变量声明(let)
2015/06/12 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
深入解析JavaScript中函数的Currying柯里化
2016/03/19 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
Vue框架中正确引入JS库的方法介绍
2017/07/30 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
vue $set 给数据赋值的实例
2019/11/09 Javascript
vue实现列表拖拽排序的功能
2020/11/02 Javascript
[01:40]2014DOTA2国际邀请赛 三冰SOLO赛后采访恶搞
2014/07/09 DOTA
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
python按比例随机切分数据的实现
2019/07/11 Python
python生成器用法实例详解
2019/11/22 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
python实现井字棋小游戏
2020/03/04 Python
CSS3实现多背景展示效果通过CSS3定位多张背景
2014/08/10 HTML / CSS
Carolina Lemke Berlin澳大利亚官网:时尚太阳镜品牌
2019/09/17 全球购物
法制宣传教育方案
2014/05/09 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
批评与自我批评范文
2014/10/15 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
公司处罚决定书
2015/06/24 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
Python OpenCV实现图形检测示例详解
2022/04/08 Python