Django(三)runserver 命令源码分析
应用环境
- windows7
- pycharm2018 profession
- python3.6
- django2.0
我们在pycharm 启动django项目时,常常有这么一个命令操作:
- python manage.py runserver
这里的意思是执行python命令,传入的参数为 manage.py runserver。这两个参数就会被保存到sys.argv 列表中。如下,新建一个demo.py
import sys
print('hello sys.argv')
print(type(sys.argv))
for arg in sys.argv:
print(arg)
在terminal窗口执行 python demo.py runserver # 循环遍历sys.argv 输出参数

PS:这里解释sys.argv 是因为在manage.py中,会用到。
打开我们的manage.py文件,可以看到,这里调用的是:
execute_from_command_line(sys.argv)
可以看到这里传入的就是我们执行python 命令传入的参数(这里是manage.py runserver)。
我们进入到 execute_from_command_line 函数,可以看到的是执行
utility.execute()
在execute这个函数中有这么一行代码,读取子命令,也即是读取sys.argv列表中第二个元素runserver,如下图

同时,在execute函数中,我们需要重点关注的是最后这一行代码:
self.fetch_command(subcommand).run_from_argv(self.argv)
这里传入的上面的读取的子命令sys.argv[1] 以及self.argv(这里的self.argv 是在构造函数中传入的sys.argv)。

我们进入到 fetch_command 函数,这里最后返回的一个Command class instance 。也就是说
self.fetch_command(subcommand).run_from_argv(self.argv)
这行代码的意思是 执行返回的实体类必然包含 run_from_argv函数。
在fetch_command中,最终调用的是
import_module('%s.management.commands.%s' % (app_name, name))
这里的注释:
Given a command name and an application name, return the Command
class instance. 通过名字返回实例,这里类似net中IL编程:动态导入(动态生成程序集)【这是本篇博文的重点】。
通过:
print('%s.management.commands.%s' % (app_name, name))
我们发现动态导入的实例是:
django.contrib.staticfiles.management.commands.runserver
而我们的 import_module 函数最终执行的也是python标准库 importlib下importlib._bootstrap中的gcd_import。如图:

通过上面的分析,我们知道最终执行的是模块:
django.contrib.staticfiles.management.commands.runserver
下的run_from_argv 函数。
我们打开runserver.py文件,也确是没有找到该函数,而在其父类中找到:

从上图看出,这个函数最终执行的是execute函数。而在execute中最终执行却又是:
output = self.handle(*args, **options)
这里的handle是:
def handle(self, *args, **options):
"""
The actual logic of the command. Subclasses must implement
this method.
"""
raise NotImplementedError('subclasses of BaseCommand must provide a handle() method')
我们从注释可以知道,这个方法需要由子类实现的,也即最后,最后,最后执行的runserver中handle函数。
分析到这里,已基本很明了,最终执行的是在本地的8000端口启动一个socketserver监听程序。
分析所得:
- get到python如何进行动态的导入
- sys.argv 存储了全局中输入参数
- sys.moduls注册了程序运行已经导入模块
- if 赋值的优雅写法 subcommand = 'runserver' if 1== 'condition' else 'hello'
这里一行代码等价于这么写:
if 1=='condition' :
subcommand = 'runserver'
else:
subcommand = 'hello'
这里一行代码搞定,看起来不错。
希望这篇文字可以帮助到大家。刚接触python,若是有不对的地方,欢迎指出。谢谢。
Django(三)runserver 命令源码分析的更多相关文章
- memcached学习笔记——存储命令源码分析下篇
上一篇回顾:<memcached学习笔记——存储命令源码分析上篇>通过分析memcached的存储命令源码的过程,了解了memcached如何解析文本命令和mencached的内存管理机制 ...
- memcached学习笔记——存储命令源码分析上篇
原创文章,转载请标明,谢谢. 上一篇分析过memcached的连接模型,了解memcached是如何高效处理客户端连接,这一篇分析memcached源码中的process_update_command ...
- Java 序列化和反序列化(三)Serializable 源码分析 - 2
目录 Java 序列化和反序列化(三)Serializable 源码分析 - 2 1. ObjectStreamField 1.1 数据结构 1.2 构造函数 2. ObjectStreamClass ...
- debug:am、cmd命令源码分析
debug:am.cmd命令源码分析 目录 debug:am.cmd命令源码分析 am命令的实现 手机里的am am.jar cmd命令的实现 手机里的cmd cmd activity cmd.cpp ...
- TiDB show processlist命令源码分析
背景 因为丰巢自去年年底开始在推送平台上尝试了TiDB,最近又要将承接丰巢所有交易的支付平台切到TiDB上.我本人一直没有抽出时间对TiDB的源码进行学习,最近准备开始一系列的学习和分享.由于我本人没 ...
- Django之REST framework源码分析
前言: Django REST framework,是1个基于Django搭建 REST风格API的框架: 1.什么是API呢? API就是访问即可获取数据的url地址,下面是一个最简单的 Djang ...
- Python学习---Django的request.post源码分析
request.post源码分析: 可以看到传递json后会帮我们dumps处理一次最后一字节形式传递过去
- Django rest framework 版本控制(源码分析)
基于上述分析 #2.处理版本信息 处理认证信息 处理权限信息 对用户的访问频率进行限制 self.initial(request, *args, **kwargs) #2.1处理版本信息 #versi ...
- storm shell命令源码分析-shell_submission.clj
当我们在shell里执行storm shell命令时会调用shell_submission.clj里的main函数.shell_submission.clj如下: shell_submission.c ...
随机推荐
- Ubuntu下安装GTK环境
要生成C图形界面的程序,得安装GTK环境 安装GTK环境只要安装一个gnome-core-devel就可以了,里面集成了很多其他的包.除此之外还要转一些其他的 东西,如libglib2.0 ...
- MySQL设计软件登录模块
学了一段时间的Java了,思量着做一点简单的小模块的东西吧,于是就有了下面的这个简单的小案例. 大致实现的功能就是注册于登录还有就是用到了一点,分层思想.仅此而已,所以非常的适合新手围观. 建立好数据 ...
- 初探linux子系统集之timer子系统(三)
因为现在的linux虽然还是可以使用低精度的timer,但是趋势是高精度hrtimer,所以上一篇试着翻译一下hrtimer的一些介绍,翻译的不是很好,看来英语还得好好学习啊,下面还是好好学习下lin ...
- 后端分布式系列:分布式存储-HDFS NameNode 设计实现解析
接前文 分布式存储-HDFS 架构解析,我们总体分析了 HDFS 架构的主要构成组件包括:NameNode.DataNode 和 Client.本文首先进一步解析 HDFS NameNode 的设计和 ...
- Andriod Studio科普篇——4.关于编译的常见问题
1.android支持库未安装 编译不过,提示如下: Could not find any version that matches com.android.support:appcompat-v7: ...
- RAMCloud:内存云存储的内存分配机制
现在全闪存阵列已经见怪不怪了,EMC的XtremIO,还有VNX-F(Rockies),IBM FlashSystem.全闪存真正为效率而生,重新定义存储速度.凭借极致性能,高可用性,为您极大提高企业 ...
- SVM及其c++代码运用实例
最近做个小东西,要用到SVM,搜索网上,发现大伙都是各种介绍理论,让我等小码农晕头转向,是故自己学习总结一下,并将代码实例展示出来,方便大家共同探讨,该代码是用opencv编写的,很容易学习滴. 1. ...
- 图文浅析Binder机制
总述: Binder是Android系统提供的一种IPC机制,Android系统基本就可以看做基于Binder的C/S架构,Binder也是C/S形式出现,它属于驱动但是驱动的一段内存而不是设备,框架 ...
- 12.1、Libgdx的图像之持续性和非持续性渲染
(官网:www.libgdx.cn) Libgdx在默认情况下,渲染现成调用render()方法进行持续性渲染.频率取决于你的硬件设备. 有时候有些游戏中并不需要持续性的渲染,为了省电,可以关掉持续性 ...
- chrome "Provisional headers are shown"
我的问题的,每次打开浏览器,点开有视频的页面(云平台的存储),然后当视频还没有加载完,就马上关闭,连续操作很多次(测试的暴力测试把),F12查看就有很多很多在加载中的连接,因为连续点击太多次了,第一个 ...