首页 > 技术文章 > 【Django】runserver 0.0.0.0:0 后,究竟发生了什么

LoveOpenSourceBoy 2020-08-06 23:35 原文

一个很有趣的个人博客,不信你来撩 fangzengye.com



WSGI协议

Django是遵循WSGI协议设计的

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

  • WSGI server:负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端
  • WSGIapplication:接收由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随机绑定一个

推荐阅读