三个对象:
- HTTP Client(浏览器)
- HTTP Server (uWSGI、gunicorn)
- FrameWork/Application (Flask、Pyramid、Django)
详细展开:
零
Clinet发送请求,Server将App处理的Response返回。以Server的角度,两个动作,接收请求和返回响应**
一
Client发送一个请求 HTTP Request,Server接受请求转交给 Application,Application处理请求,通过Server返回 HTTP response 给Client,Client加载数据,完成一次HTTP处理流程。**
二
- 接受请求: Server收到Request,调用(invoke)来自App的「application」对象,Server通过解析Request生成「application」对象的参数,一个字典-
environ
一个可调用对象start_response
,这个对象就是App的唯一入口。
def simple_app(environ, start_response):
pass
- 返回响应:
App将status、headers、body,返回给Server
def simple_app(environ, start_response):
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
# 先将status,response_headers作为参数返回给start_response
start_response(status, response_headers)
# 再返回body
return ['hello, world']
服务器把状态,响应头,响应体合并到HTTP响应里,然后传给(HTTP)客户端。
三.两个参数
environ
: 由Server通过Request生成。
包含 CGI/WSGI 规范的变量及参数、数据等,比如Client的请求方法、HTTP headers中的content-type内容、HTTP协议版本、WSGI版本等
start_response
: 接收两个必选参数和一个可选参数
- status: 一个字符串,表示HTTP响应状态字符串
- response_headers: 一个列表,包含有如下形式的元组:(header_name, --- header_value),用来表示HTTP响应的headers
- exc_info(可选): 用于出错时,server需要返回给浏览器的信息
Middleware
Django的middleware是Django的一种hook机制
Application主要工作:
接受 environ、start_response参数
生成 状态码、headers
返回Response
def app(environ, start_response):
status = '200 OK'
response_headers = [('Content-Type', 'text/plain')]
start_response(status, response_headers)
return ['Hello world from a simple WSGI application!\n']
Django:
python manage.py runserver
自己生成了一个WSGIServer。
django.core.servers.basehttp.get_internal_wsgi_application
->
get_wsgi_application()