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 相关文章推荐
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
Apr 11 Python
Python实现控制台进度条功能
Jan 04 Python
Python对list列表结构中的值进行去重的方法总结
May 07 Python
python数据结构之列表和元组的详解
Sep 23 Python
对numpy和pandas中数组的合并和拆分详解
Apr 11 Python
Python读写docx文件的方法
May 08 Python
Python 编程速成(推荐)
Apr 15 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
python创建与遍历List二维列表的方法
Aug 16 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
Apr 13 Python
python代码实现猜拳小游戏
Nov 30 Python
python安装及变量名介绍详解
Dec 12 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
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
2014/10/30 PHP
php魔术变量用法实例详解
2014/11/13 PHP
php实现短信发送代码
2015/07/05 PHP
PHP实现导出带样式的Excel
2016/08/28 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
js function定义函数使用心得
2010/04/15 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
js中AppendChild与insertBefore的用法详细解析
2013/12/16 Javascript
jQuery中ajax的使用与缓存问题的解决方法
2013/12/19 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
Array数组对象中的forEach、map、filter及reduce详析
2018/08/02 Javascript
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
[01:01:22]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python中wx将图标显示在右下角的脚本代码
2013/03/08 Python
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
Flask-Mail用法实例分析
2018/07/21 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
生产车间班组长岗位职责
2014/01/06 职场文书
代理商会议邀请函
2014/01/27 职场文书
小学教师办公室制度
2014/02/03 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
总结会主持词
2015/07/02 职场文书
2015国庆66周年宣传语
2015/07/14 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
Docker部署Mysql8的实现步骤
2022/07/07 Servers