WSGI Server

三个对象:

  • 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()

你可能感兴趣的:(WSGI Server)