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()

django python manage.py runserver 流程的更多相关文章

  1. No module named _sqlite3 django python manage.py runserver

    linux 执行django(python manage.py runserver),报错No module named _sqlite3,需要安装sqlite-devel,再重新编译安装python ...

  2. django源码分析 python manage.py runserver

    django是一个快速开发web应用的框架, 笔者也在django框架上开发不少web应用,闲来无事,就想探究一下django底层到底是如何实现的,本文记录了笔者对django源码的分析过程 I be ...

  3. django python mange.py runserver 源码

    django python mange.py runserver 源码 入 口 mange.py文件 execute_from_command_line函数 输入参数为['manage.py', 'r ...

  4. python manage.py runserver指定端口和ip

    python manage.py runserver 0.0.0.0:8000 在本地运行程序,python manager.py runserver打开http://127.0.0.1:5000端口 ...

  5. python manage.py runserver 0.0.0.0:8000

    python manage.py runserver 这种命令行,可以在服务器端输入IP:8000直接访问 在 python manage.py runserver 127.0.01:8000 在服务 ...

  6. 关于django python manage.py startapp 应用名 出错异常原因

    如题,在控制台运行python manage.py startapp sales 建立一个应用报错异常 1.应用名不能包含下划线等字符 所以app-demo 不能作为应用名被定义 2.manage.p ...

  7. python后台架构Django教程——manage.py命令

    一.manage.py命令选项 manage.py是每个Django项目中自动生成的一个用于管理项目的脚本文件,需要通过python命令执行.manage.py接受的是Django提供的内置命令. 内 ...

  8. Django笔记 manage.py脚本的使用

    1. 管理Django项目 python manage.py startproject projectname # 新建Django project ~~projectname是自己的项目名称 pyt ...

  9. django 1.7之后python manage.py syncdb没有了

    在命令行输入python manage.py createsuperuser按照提示输入即可记得先初始化表. django>1.7 python manage.py makemigrations ...

随机推荐

  1. 李航统计学习方法(第二版)(十):决策树CART算法

    1 简介 1.1 介绍 1.2 生成步骤 CART树算法由以下两步组成:(1)决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;(2)决策树剪枝:用验证数据集对己生成的树进行剪枝并选择最优子 ...

  2. 精通java并发-synchronized关键字和锁

    目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages synchronized关键字和锁 示例代码 public class MyThreadTest2 { public ...

  3. jquery 选项卡切换、选项卡封装、简单的jquery选项卡封装、tab切换效果

    相信选项卡切换是大家常用的效果单独写一个选项卡切换很方便但是要是一个页面出现多个选项卡不做封装的话会显得代码很杂乱 <div class="bodyCenter"> & ...

  4. 011.Nginx防盗链

    一 盗链 1.1 盗链概述 盗链指的是在自己的界面展示非本服务器上的内容,通过技术手段获得其他服务器的资源.绕过他人资源展示页面,在自己页面向用户提供此内容,从而减轻自己服务器的负担,因为真实的空间和 ...

  5. django admin后台管理功能的学习

    1.简要说明 用过Django框架的童鞋肯定都知道,在创建完Django项目后,每个app下,都会有一个urls.py文件,里边会有如下几行: from django.contrib import a ...

  6. echarts 实战 : 想让图例颜色和元素颜色对应,怎么办?

    首先,在 series 里设置颜色. (我是用js生成 echarts 需要的option对象,所以可能很难看懂) normalData.sData.forEach((item, index) =&g ...

  7. PyQt5事件处理

    事件介绍 事件的处理机制非常的复杂,属于PyQt底层的事,不必我们关心,学会使用就行.如果说事件是用来创建窗口,那么信号与槽就是用来对这个控件进行处理.事件属于低级的处理方式,信号与槽是高级的处理方式 ...

  8. apache 添加多个站点

    虚拟主机 (Virtual Host) 是在同一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术.可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口,也可让多个网站拥有不同的域 ...

  9. 带你理解Lock锁原理

    同样是锁,先说说synchronized和lock的区别: synchronized是java关键字,是用c++实现的:而lock是用java类,用java可以实现 synchronized可以锁住代 ...

  10. vue怎么自定义组件

    我们在搭建好的手脚架中 进行使用 一.在src =>components => 创建XXbtn文件夹用来存放你的组件 =>在创建一个vue的文件 . 二.在src => com ...