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中几个常用的类方法
Apr 08 Python
Python 爬虫学习笔记之正则表达式
Sep 21 Python
import的本质解析
Oct 30 Python
python程序快速缩进多行代码方法总结
Jun 23 Python
Pandas之groupby( )用法笔记小结
Jul 23 Python
Django中在xadmin中集成DjangoUeditor过程详解
Jul 24 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
Python进程间通信multiprocess代码实例
Mar 18 Python
Python如何使用队列方式实现多线程爬虫
May 12 Python
python切割图片的示例
Nov 12 Python
用Python制作灯光秀短视频的思路详解
Apr 13 Python
pytorch--之halfTensor的使用详解
May 24 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中this,self,parent的区别详解
2013/06/08 PHP
php的ajax简单实例
2014/02/27 PHP
php中 $$str 中 "$$" 的详解
2015/07/06 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
深入浅析用PHP实现MVC
2016/03/02 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
jQuery Ajax实现跨域请求
2017/01/21 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
vue侧边栏动态生成下级菜单的方法
2018/09/07 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
实例分析javascript中的异步
2020/06/02 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
Python中用format函数格式化字符串的用法
2015/04/08 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
基于python使用tibco ems代码实例
2019/12/20 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
法务专员岗位职责
2014/01/02 职场文书
ktv中秋节活动方案
2014/01/30 职场文书
服装促销活动方案
2014/02/23 职场文书
2014全国两会心得体会
2014/03/17 职场文书
行政管理专业求职信
2014/07/06 职场文书
课外科技活动总结
2014/08/27 职场文书
个性与发展自我评价
2015/03/06 职场文书
大学生村官工作总结2015
2015/04/09 职场文书