WSGI协议

Django是遵循WSGI协议设计的

WSGI协议主要包括server和application两个部分:

  1. WSGI server:负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端
  2. WSGI application:接收由server转发的request,处理请求,并将处理结果返回给server。application中可以包含多个栈式的中间件,这些中间件需要同时实现server与application:对server来说,中间件扮演应用程序;对应用程序来说,中间件扮演服务器

可以选择任意的server和application组合实现自己的web应用。

runserver后到底发生了什么

通过runserver运行的Django主进程会创建一个WSGIServer的实例,WSGIServer父类是操作socket的TCPServer。

WSGIServer将打开一个socket,并将此socket绑定到runserver参数中指定的ip和端口,然后调用socket.listen()开始监听请求。

当请求来临,WSGIServer会调用WSGIHandler这个application,在application中执行Django框架对请求数据的一系列处理。

runserver 0.0.0.0:8000

runserver 0.0.0.0:8000表示将django进程使用的socket绑定ip设置为INADDR_ANY(0),因此socket会在8000端口监听从本机所有网卡发来的数据,相当于绑定了本机的所有ip地址。

比如你的机器有三个ip

  192.168.1.1
202.202.202.202
61.1.2.3

使用runserver 0.0.0.0:8000启动的django进程可以通过服务器的所有ip访问到,而使用runserver 192.168.1.1:8000,只有通过192.168.1.1:8000才能够访问

如果本机有唯一的ip地址192.168.1.1,那么runserver 0.0.0.0:8000 就等同于 runserver 192.168.1.1:8000

runserver 127.0.0.1

表示将socket绑定到本机回环地址,只能监听本机对此服务的请求

runserver 0.0.0.0:0

如果不为socket指定绑定任何端口,或者将绑定的端口设置为0时,系统会在本机可选的端口中为socket随机绑定一个

下面来实验一下:

$ python manage.py runserver 0.0.0.0:0
Performing system checks... System check identified no issues (0 silenced).
April 29, 2020 - 19:53:25
Django version 2.0.13, using settings 'qaboard.settings'
Starting development server at http://0.0.0.0:0/
Quit the server with CONTROL-C.

尝试找到这个服务绑定的端口:

$ ps -ef|grep 0.0.0.0:0
luozx 896 19075 0 19:53 pts/28 00:00:00 python manage.py runserver 0.0.0.0:0
luozx 901 896 4 19:53 pts/28 00:00:04 /home/luozixi/myserver/venv/bin/python manage.py runserver 0.0.0.0:0
luozx 1070 28816 0 19:54 pts/37 00:00:00 grep 0.0.0.0:0

发现有两个进程,这是因为runserver默认启动两个进程,一个进程是提供服务的django应用,一个进程用于检测项目代码修改,如果有修改则自动重启主进程

如果在runserver时使用 "--noreload" 参数则不会启动检测进程

$ python manage.py runserver 0.0.0.0:0 --noreload
$ ps -ef|grep 0.0.0.0:0
luozx 1429 19075 38 19:56 pts/28 00:00:01 python manage.py runserver 0.0.0.0:0 --noreload
luozx 1447 28816 0 19:56 pts/37 00:00:00 grep 0.0.0.0:0

查看进程标识符为1429的进程使用的socket绑定了哪个端口

$ netstat -nltp|grep 1429
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:48381 0.0.0.0:* LISTEN 1429/python

从服务器的48381端口就可以访问我们的django服务了

参考资料

Python Web开发最难懂的WSGI协议,到底包含哪些内容?

python从小白到入门:10分钟搞懂WSGI协议

About IP 0.0.0.0 in Django

Socket.Bind(EndPoint) 方法

socket INADDR_ANY 监听0.0.0.0地址 socket只绑定端口让路由表决定传到哪个ip

【Django】runserver 0.0.0.0:0 后,究竟发生了什么的更多相关文章

  1. 在浏览器地址栏输入URL,按下回车后究竟发生了什么?

    1.DNS 在浏览器中输入URL后,首先要进行DNS解析,DNS解析的顺序为: 浏览器缓存 本地hosts文件 系统缓存 路由器缓存 DNS服务器迭代查询 2.发送请求 通过DNS得到目标的IP地址后 ...

  2. 2021-2-28:调用 System.gc() 后究竟发生了什么?

    首先,根据 DisableExplicitGC 这个 JVM 启动参数的状态,确定是否会 GC,如果需要 GC,不同 GC 会有不同的处理. 1. G1 GC 的处理 如果是 System.gc() ...

  3. Django:Python3.6.2+Django2.0配置MySQL

    持续学习Django中... Django默认使用的数据库是python自带的SQLlite3,但SQLlite并不适用于大型的项目,因此我将数据库换成了MySQL,下面介绍下Django如何配置数据 ...

  4. Django:Python3.6.2+Django2.0配置MySQL 转载

    Django默认使用的数据库是python自带的SQLlite3,但SQLlite并不适用于大型的项目,因此我将数据库换成了MySQL,下面介绍下Django如何配置数据库... 我使用的版本是:Py ...

  5. BladeX 2.0.7.RELEASE版本git后,在idea中导入项目,结果无法运行FlowApplication等几个服务的错误

    问题:2.0.7.RELEASE版本git后,在Intellij IDEA运行项目,结果无法运行FlowApplication等几个服务的错误 描述:打开IDEA,点击Check out from V ...

  6. 123457123456#0#-----com.yuming.baoBaoAiXueXi01hanzi--前拼后广--幼儿园宝宝学汉字

    123457123457#0#-----com.yuming.baoBaoAiXueXi01hanzi--前拼后广--幼儿园宝宝学汉字

  7. Django学习day14BBS项目开发1.0

    每日测验 """ 1.简述auth模块功能 2.简述项目开发流程 3.简述bbs表设计 """ 内容回顾 auth模块 "&quo ...

  8. IIS6.0添加上.net4.0后,以前的.net系统出现“服务器应用程序不可用”的错误提示解决办法

    把VS2010开发的网站.net4.0部署到Windows Server 2003的服务器上去, Windows Server 2003操作系统自带的为IIS 6.0,IIS 6.0一般只支持.NET ...

  9. 编译可在Nexus5上运行的CyanogenMod13.0 ROM(基于Android6.0)

    编译可在Nexus5上运行的CyanogenMod13.0 ROM (基于Android6.0) 作者:寻禹@阿里聚安全 前言 下文中无特殊说明时CM代表CyanogenMod的缩写. 下文中说的“设 ...

随机推荐

  1. javascript中的符号 == 和 === 的区别

    ==  表示相等 即仅仅比较两边变量的数值是否相等. 相等运算符隐藏的类型转换,会带来一些违反直觉的结果. 这就是为什么建议尽量不要使用相等运算符. 至于使用相等运算符会不会对后续代码造成意外影响,答 ...

  2. JavaScript new 的时候到底发生了什么?

    function Person(name) { this.name = name; } let liLei = new Person('lilei'); console.log(liLiei.name ...

  3. Light of future-冲刺Day 5

    目录 1.SCRUM部分: 每个成员进度 SCRUM 会议的照片 签入记录 代码运行截图 用户浏览界面 订单详情界面 管理员浏览界面 新增后台界面 2.PM 报告: 时间表 燃尽图 任务总量变化曲线 ...

  4. Redis 练习(一)

    来自<Redis 实战>第一章 对于 Redis 数据结构类型及使用不太清楚的可以参考 此链接 需求: 网站需要根据文章的发布时间和文章获得的投票数量计算出一个评分,然后按照这个评分来决定 ...

  5. Shell:Day10

    shell脚本:明白一点:shell脚本本身是一个工具 在写shell脚本之前,就要明白:这个功能能到底如何实现? curl 访问文件源代码,查看网站状态: 才能通过shell(bash)所提供的逻辑 ...

  6. (js描述的)数据结构 [数组的一些补充](1)

    (js描述的)数据结构 [数组的一些补充](1) 1. js的数组: 1.优点:高度封装,对于数组的操作就是调用API 2.普通语言的数组: 1.优点:根据index来查询,修改数据效率很高 2.缺点 ...

  7. Java第六天,API中常用的类,StringBuffer、StringBuilder、包装类、System类的使用

    System (1)这个类中有很多可以获取系统信息的类. public class SystemLearn { public static void main(String[] args) { lon ...

  8. Array(数组)对象-->sort() 方法

    1.定义和用法 sort() 方法用于对数组的元素进行排序. 默认排序顺序为按字母升序. 语法: array.sort(sortfunction) 参数: sortfunction:规定排序顺序.必须 ...

  9. Pod容器共享Volume

    同一个Pod中的多个容器能够共享Pod级别的存储卷Volume.Volume可以被定义为各种类型,多个容器各自进行挂载操作,将一个Volume挂载为容器内部需要的目录,如图 在下面的例子中,在Pod内 ...

  10. 使用原生js实现选项卡功能实例教程

    选项卡是前端常见的基本功能,它是用多个标签页来区分不同内容,通过选择标签快速切换内容.学习本教程之前,读者需要具备html和css技能,同时需要有简单的javascript基础. 先来完成html部分 ...