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. Go的100天之旅-03变量

    变量 变量介绍 变量这个词来源于数学,类似方程中的x.y,代表的是存储在计算机中的值.这里主要介绍Go和其它编程语言不一样的地方,在前面我们提到过,Go是一门静态语言.静态语言区别动态语言一个重要的特 ...

  2. 采用 Unicode 标点属性方式的正则表达式,可以去掉所有的标点符号,

    public class Test { public static void main(String[] args) { String str = "!!!??!!!!%*)%¥!KTV去符 ...

  3. 图解:如何实现最小生成树(Prim算法与Kruskal算法)

    这是图算法的第四篇文章 图解:如何实现最小生成树 文章目录: 1.概念和性质 2.思路探索 3.Kruskal算法 4.Prim算法 5.代码实现 1.概念和性质 今天我们考虑的模型是加权无向图,问题 ...

  4. 集训 T1-找试场

    大致题意: 按照给定的指令移动,输出最后到达的点. 若没有走动过则输出(0,0). 基本思路 这题就是模拟,主要是判断指令的时候不太好判断, 先用字符串把指令读取进来,看看第一位是否是数字(如果是数字 ...

  5. 信不信?各种红包App最后都会整合游戏!App+游戏的变现模式分析

    最近两个月「晓衡在线猿码微服」商城上出现了一类需求特别的客户: 我们有个 App,日活用户达到 XXX万,计划在 App 中嵌入游戏增加用户留存和利用流量变现,还有... 看你们这里游戏不少,想了解一 ...

  6. 【JVM之内存与垃圾回收篇】执行引擎

    执行引擎 执行引擎概述 执行引擎属于 JVM 的下层,里面包括 解释器.及时编译器.垃圾回收器 执行引擎是 Java 虚拟机核心的组成部分之一. "虚拟机"是一个相对于" ...

  7. WPF入门教程(一)---基础

    这篇主要讲WPF的开发基础,介绍了如何使用Visual Studio 2013创建一个WPF应用程序. 首先说一下学习WPF的基础知识: 1) 要会一门.NET所支持的编程语言.例如C#. 2) 会一 ...

  8. 4.pandas的进阶查询

    简单的查询其实根本不能满足实际开发的需求 需求可能是让你查一下2018年的销售额啊,2019年温度超过30℃的天数啊等等的 这些需求都是有异曲同工的,就是带条件的查询 这里我们先自己设计一个表格,并将 ...

  9. .NET Core + K8S + Loki 玩转日志聚合

    1. Intro 最近在了解日志聚合系统,正好前几天看到一篇文章<用了日志系统新贵Loki,ELK突然不香了!>,所以就决定动手体验一下.本文就带大家快速了解下Loki,并简单介绍.NET ...

  10. Centos7安装Docker1.9.1

    1.先检查是否安装旧版本docker [root@registry ~]# rpm -qa|grep docker 我这里没有安装,如果安装,请rpm -e 卸载2.编辑docker.repo文件,写 ...