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. 机器学习实战基础(二十一):sklearn中的降维算法PCA和SVD(二) PCA与SVD 之 降维究竟是怎样实现

    简述 在降维过程中,我们会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型的表现可能会因此受影响.同时,在高维数据中,必然有一些特征是不带有有效的信息的(比如噪音),或 ...

  2. [apue] Linux / Windows 系统上只能建立不超过 PATH_MAX / MAX_PATH 长度的路径吗?

    问题的提出 在处理文件系统路径的时候,我们一般会先开辟一块内存区,用来接收路径.或者拼接好路径传递给系统调用.这是因为路径在各个系统上都有最大长度限制,在 Windows 上这个值是 MAX_PATH ...

  3. python实现图片文字提取,准确率高达99%,强无敌!!!

    上次我使用的百度AI开放平台的API接口实现图片的转化,后来有许多小伙伴都私信问我,怎么获取百度AI平台的AK和SK.为了统一回答大家的问题,今天我又使用百度API实现了一个从图片中提取文字和识别身份 ...

  4. (3)html-webpack-plugin的作用

    在内存中生成index.html页面 在前面的内容中我们已经知道了如何在内存中打包main.js并引入到页面中. 同样的,我们也可以把index.html也打包放入到内存中. 安装html-webpa ...

  5. Spring Boot 2.x基础教程:EhCache缓存的使用

    上一篇我们学会了如何使用Spring Boot使用进程内缓存在加速数据访问.可能大家会问,那我们在Spring Boot中到底使用了什么缓存呢? 在Spring Boot中通过@EnableCachi ...

  6. Python Hacking Tools - Vulnerability Scanner

    Security Header website: https://securityheaders.com/ Scan the target website: https://www.hackthiss ...

  7. 使用 forever 启动 vue 需要注意的问题

    forever 是 nodejs 生态中一个用来永久挂起一个应用(当这个应用崩溃时能自己重启)的应用(库). 但用他启动vue的时候必须注意一个问题: 在哪个路径启动vue,就在哪个路径启动forev ...

  8. Selenium自动化:有代码测试与无代码测试。这些你都懂了吗?

    大多数测试人员认为 Selenium是满足其测试自动化需求的自动化框架.作为全球测试人员使用的开放源框架, Selenium 无疑是测试人员适应日趋敏捷的公司的一种好方法.实际上, Selenium仍 ...

  9. 火狐浏览器如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接  火狐浏览器如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1.无需下载 ...

  10. 组件缓存注意事项 ---keep-alive