[TimLinux] django WSGI入口分析及自定义WSGIHandler思路
1. 命令行启动
命令行是通过runserver子命令来启动的,对应的django模块为django.core.management.commands.runserver,调用关系结构:
# 简化的运行代码:
django.core.management.commands.runserver.py class Command:
def get_handler():
return django.core.servers.basehttp.get_internal_wsgi_application() def run: # 命令行如果函数
self.run_inner() def run_inner():
handler = self.get_handler()
django.core.servers.basehttp.run(..., handler, ...) django.core.servers.basehttp.py
def get_internal_wsgi_application():
1. settings.WSGI_APPLICAITON
2. 上面的配置不存在,则执行:
django.core.wsgi.get_wsgi_application() def run():
启动http服务,监听端口,注册WSGI django.core.wsgi.py
def get_wsgi_application():
django.setup()
return django.core.handlers.wsgi.WSGIHandler() django.core.handlers.wsgi.py
class WSGIHandler(base.BaseHandler):
def __init__():
self.load_middleware() # 装载了中间件 def __call__(self, environ, start_response): # 请求的入口函数
pass
2. web服务器启动
Web服务器配置:
WSGIScriptAlias / /my/web/site/site/wsgi.py site/wsgi.py # 这个文件默认是与settings.py同级
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE", 'site.settings')
application = get_wsgi_applicaiton() application变量的获取与命令行最后部分是一致的。
3. 核心
这个核心函数的处理内容:
django.core.wsgi.WSGIHandler.__call__(self, environ, start_response)
1. 发送一个信号
2. 处理请求、处理中间件
3. 处理响应
4. 调用start_response返回响应头
5. 返回响应体 __call__ 函数的特点:
1. 每次请求的入口函数
2. 这个函数内部代码都属于请求过程,也就是线程工作空间
4. 自定义 WSGI 思路
关键在于自定义 get_wsgi_applicaiton函数:
1. 根据代码,我认为可以在 settings 中配置 WSGI_APPLICATION 的方式来定义该函数,这个可能只能解决命令行启动问题
2. web服务器启动的时候,因为 site/wsgi.py 文件属于站点独立文件,我们其实可以自己重新这个文件的,这样很容易调用到自己定义的 get_wsgi_application() 函数
3. get_wsgi_applicaiton() 函数的返回值 设置为自己实现的 WSGIHandler() 就可以实现自己的 WSGI了。
4. 在 WSGIHandler 的 __call__ 方法内,定义一些全局变量,这个变量将属于整个线程,并且可以在各关联函数内使用,比如给
signals增加一个request 属性,则可以在所有 signal receiver函数内访问到这个属性了。
def __call__(...):
setattr(signals, 'request', request)
5. 另外一种方法
这个方法的关键在于提供一个 middleware,然后在 middleware 的process_request 方法内,给一个公共模块设置属性的值,
这样这个属性的值在各模块内都是可访问的。 class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
setattr(signals, 'request', request) def my(sender, **kwargs):
if hasattr(signals, 'request'):
print(singals.request) request_started.connect(my, sender=WSGIRequest) 这个方式不是线程安全的,signals对象属于进程变量,在所有现在内共享。可以考虑使用threading.local技术来实现线程安全的请求变量赋值。
[TimLinux] django WSGI入口分析及自定义WSGIHandler思路的更多相关文章
- django源码分析——处理请求到wsgi及视图view
本文环境python3.5.2,django1.10.x系列 根据前上一篇runserver的博文,已经分析了本地调试服务器的大致流程,现在我们来分析一下当runserver运行起来后,django框 ...
- python web框架 django wsgi 理论
django wsgi python有个自带的wsgi模块 可以写自定义web框架 用wsgi在内部创建socket对象就可以了 自己只写处理函数就可以了django只是web框架 他也不负责写soc ...
- Spring Ioc源码分析系列--Ioc源码入口分析
Spring Ioc源码分析系列--Ioc源码入口分析 本系列文章代码基于Spring Framework 5.2.x 前言 上一篇文章Spring Ioc源码分析系列--Ioc的基础知识准备介绍了I ...
- MongoDB源码分析——mongo主程序入口分析
Edit 源码版本为MongoDB 2.6分支 mongo主程序入口分析 mongo是MongoDB提供的一个执行JavaScript脚本的客户端工具,可以用来和服务端交互,2.6版本的Mongo ...
- MongoDB源码分析——mongod程序源码入口分析
Edit 说明:第一次写笔记,之前都是看别人写的,觉得很简单,开始写了之后才发现真的很难,不知道该怎么分析,这篇文章也参考了很多前辈对MongoDB源码的分析,也有一些自己的理解,后续将会继续分析其他 ...
- 开源GUI-Microwindows之程序入口分析
**************************************************************************************************** ...
- asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...
- Android 短信模块分析(三) MMS入口分析
MMS入口分析: 在Mms中最重要的两个Activity,一个是conversationList(短信列表) ,另一个就是ComposeMessageActivity(单个对话或者短信).每 ...
- 强大的django-debug-toolbar,django项目性能分析工具
强大的django-debug-toolbar,django项目性能分析工具 给大家介绍一个用于django中debug模式下查看网站性能等其他信息的插件django-debug-toolbar 首先 ...
随机推荐
- Nginx使用反向代理实现负载均衡
Nginx使用反向代理实现负载均衡 yls 2019-9-20 简介 基于docker容器以及docker-compose,所以需要自学docker在linux环境的基本使用 使用两个tomcat作为 ...
- Geometry 判断几何是否被另一个几何/线段分割成多段
如下图,如何判断几何多边形A被多边形B,切割为多段几何? 几何A被几何B切割 1. 获取几何A与几何B的交集C var intersectGeometry = new CombinedGeometry ...
- [剑指offer]第1题,二维数组中的查找
①题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- Python3.7.1学习(三)求两个list的差集、并集与交集
在python3.7.1对列表的处理中,会经常使用到Python求两个list的差集.交集与并集的方法. 下面就以实例形式对此加以分析. # 求两个list的差集.并集与交集# 一.两个list差集# ...
- 【计算机网络】TCP基础知识详解
1. TCP概念相关 [!NOTE] TCP(Transmission Control Protocol),又叫传输控制协议. TCP协议是面向连接的,可靠的,基于字节流的传输协议.在基于 TCP 进 ...
- 力扣(LeetCode)2的幂 个人题解
给定一个整数,编写一个函数来判断它是否是 2 的幂次方. 示例 1: 输入: 1 输出: true 解释: 20 = 1 示例 2: 输入: 16 输出: true 解释: 24 = 16 示这题是考 ...
- 领扣(LeetCode)对称二叉树 个人题解
给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,nul ...
- 【Java实例】使用Thumbnailator生成缩略图(缩放、旋转、裁剪、水印)
1 需求 表哥需要给儿子报名考试,系统要求上传不超过30KB的图片,而现在的手机随手一拍就是几MB的,怎么弄一个才30KB的图片呢? 一个简单的办法是在电脑上把图片缩小,然后截屏小图片,但现在的电脑屏 ...
- 2019年12月1日Linux开发手记
配置ubuntu摄像头: 1.设置→添加→usb控制器→兼容usb3.0 2.虚拟机→可移动设备→web camera→连接(断开主机) 3.查看是否配置成功,打开终端,输入: susb ls /de ...
- vue JS实现监听浏览器返回按键事件
// 这个是监听浏览器回退键的returnButton () { let vm = this; $(document).ready(function () { if (window.history & ...