什么是WSGI
WSGI全称为Python Web Server Gateway Interface,Python Web服务器网关接口,它是介于Web服务器和Web应用程序(或Web框架)之间的一种简单而通用的接口。

我们知道,客户端和服务器端之间进行沟通遵循HTTP协议。但是我们用Python所编写的很多Web程序,并不会直接去处理HTTP请求,因为这太复杂了。所以WSGI诞生了,使从HTTP请求和Web程序之间,多了一种转换过程——从HTTP报文转换成WSGI的数据格式。这个时候,我们的Web程序就可以建立在WSGI之上,直接去处理WSGI解析给我们的请求,而我们就可以专注于Web程序本身的编写。
一个简单的WSGI程序
WSGI接口定义的非常简单。根据WSGI的规定,Web程序(即WSGI程序)必须是一个可调用的对象,这个可调用对象可以是函数、方法、类或是实现了__call__方法的类实例。这个可调用的对象接收两个参数:
- environ:包含了请求的所有信息的字典。
- start_response:需要在可调用对象中调用的函数,用来发起响应,参数是状态码,响应头部等。
另外,这个可调用对象的还要返回一个可迭代的对象。
我们看一个简单的WSGI程序
def index(environ, start_response):
status = '200 OK'
response_header = [('Content-type', 'text/html')]
start_response(status, response_header)
yield b'<h1>Hello WSGi</h1>'
根据WSGI的定义,请求和响应的主体应为字节串,所以我们在这里返回的html格式字符串上加上了b前缀将其声明为bytes类型
WSGI服务器
现在我们的Web程序(WSGI程序)编写好了,就需要一个WSGI服务器来运行它。Python提供了一个wsgiref库,我们可以在开发时进行使用。
完善上面的WSGI程序如下:
from wsgiref.simple_server import make_server
def index(environ, start_response):
status = '200 OK'
response_header = [('Content-type', 'text/html')]
start_response(status, response_header)
yield b'<h1>Hello WSGi</h1>'
server = make_server('localhost', 5000, index)
server.serve_forever()
我们使用make_server(host, port, application)方法创建了一个本地服务器,分别传入主机地址、端口和可调用对象。然后使用server_forever()方法来运行它。当在shell中运行后,在浏览器中输入localhost:5000就可以看到我们编写的效果了。
WSGI服务器在启动后会监听本地端口,当收到请求时,他会将请求报文解析成一个environ字典,然后将其传给WSGI程序,同时传递start_response函数。当我们的WSGI程序将请求处理完后,会通过start_response方法来通知WSGI服务器来发起一个响应,并设置相应的响应头,然后返回响应的主体。然后WSGI服务器再将其解析成HTTP格式,返回给客户端。你也可以通过上面的图片来理解这个过程。
WSGI中间件
WSGI允许使用中间件(Middleware)来包装Web程序,在程序在调用前添加额外的设置和属性。这个特性常用来解耦程序的功能。
我们也可以给我们的程序添加一个中间件
from wsgiref.simple_server import make_server
def index(environ, start_response):
status = '200 OK'
response_header = [('Content-type', 'text/html')]
start_response(status, response_header)
yield b'<h1>Hello WSGi</h1>'
class Middleware(object):
def __init__(self, web_app):
self.web_app = web_app
def __call__(self, environ, start_response):
def before_start_response(status, header):
header.append(('middleware', 'middleware'))
return start_response(status, header)
return self.web_app(environ, before_start_response)
new_index = Middleware(index)
server = make_server('localhost', 5000, new_index)
server.serve_forever()
这里我们使用实现了__call__方法的类实例来创建WSGI的可调用对象。并通过这个中间件来为我们的Web程序添加了一个响应头(尽管这没有意义)。真正的中间件远比我们这里实现的复杂、功能强大的多。而且往往不止一个中间件,而是一个中间件堆栈,通过层层包装,实现了非常多的功能。
Web框架
现在有了WSGI,我们可以很容易实现一个Python Web程序,但是这还是不够方便,于是有了Web框架。
Python Web框架是在WSGI的上面又抽象出来一层,使之更易使用,编写的Python Web程序也更易维护。
我们以非常著名的Flask框架为例。重新实现一下上面的WSGI程序。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello WSGi</h1>'
app.run()
另外,Python还有很多流行的Web框架,例如Django,web.py、Tornado等,这里不在详细展开。
参考资料:
《Flask Web开发实战》
什么是WSGI的更多相关文章
- [原]Paste.deploy 与 WSGI, keystone 小记
Paste.deploy 与 WSGI, keystone 小记 名词解释: Paste.deploy 是一个WSGI工具包,用于更方便的管理WSGI应用, 可以通过配置文件,将WSGI应用加载起来. ...
- Django基础之wsgi
Django 一 什么是web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演 ...
- CGI, FastCGI, WSGI, uWSGI, uwsgi简述
CGI 通用网关接口(Common Gateway Interface/CGI)是一种重要的互联网技术,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据.CGI描述了服务器和请求处理程 ...
- django和apache交互的wsgi分析
很多django程序员会用django进行web程序的开发,会用django的命令行命令进行程序的调试,但不会将simpleserver换成apache的配置,也有很多django程序员知道怎么用ws ...
- Flask + WSGI + Nginx 云部署
这几天学着用flask写一些rest api,然后部署到云上.这个过程虽然网上有很多的教程,但还是遇到不少的问题! 采用flask的原因是因为它比较容易上手吧.用flask有专门restful api ...
- Ubuntu16.04 apache2 wsgi 部署django
在Ubuntu16.04上部署django其实还算简单直观,最重要的问题就是路径设置正确,并且保证版本统一,这个测试是在 Apache/2.4.18 (Ubuntu) apt-get install ...
- django自带wsgi server vs 部署uwsgi+nginx后的性能对比
一.下面先交代一下测试云主机 cpu: root@alexknight:/tmp/webbench-1.5# cat /proc/cpuinfo |grep model model : model n ...
- tornado和django的结合使用 tornado Server for django WSGI APP
#!/usr/bin/env python # Run this with # Serves by default at # http://localhost:8080/hello-tornado a ...
- 什么是 WSGI -- Python 中的 “CGI” 接口简介
今天在 git.oschina 的首页上看到他们推出演示平台,其中,Python 的演示平台支持 WSGI 接口的应用.虽然,这个演示平台连它自己提供的示例都跑不起来,但是,它还是成功的勾起了我对 W ...
- WSGI
[WSGI] WSGI:Web Server Gateway Interface. WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求.我们来看一个最简单的Web版本的 ...
随机推荐
- 【原创】NES第一波:如何用通用型6502宏汇编器,制用NES/FC游戏。
在163的博客关了呀.在这边重新开张了. 以后若网友有什么要长篇解答的问题,也在这儿作答. 作为第一波原创文章,我打算做一次小白示范.那就是一步一步的展示某个汇编编译器的用法. 一.科普 很多人认为程 ...
- Linux基础文件查找
一.文件查找 (一).命令文件 [root@linux ~]# chich ls //从PATH环境变量 [root@linux ~]# chereis vim [root@linux ~]# ech ...
- 使用 OpenSSL 为 Nginx 创建自签名证书 并开启客户端身份验证
本文章默认读者了解Openssl,CA,网站证书相关知识,直接实战!配置完成后,浏览器会显示"安全的HTTPS"连接.不会像其他文章那样,是红色警告的证书提示. 准备环境 笔者使用 ...
- CSS:抗锯齿 font-smoothing
本文引自:http://www.cnblogs.com/sunshq/p/4595673.html -webkit-font-smoothing 这个属性可以使页面上的字体抗锯齿,使用后字体看起来会更 ...
- 关于p标签不能嵌套div标签引发的标签嵌套问题总结
问题由来:<p>中嵌套<div>标签,两个都是块级元素,按理应该可以正常显示,但是最后的结果居然是多出来一段<p>的效果,所以就在网上找了许多关于标签嵌套规则的资料 ...
- Alfred上可提高工作效率的Workflow推荐
温馨提示:本文中Alfred是Mac平台的工具,不适用于其他平台. Alfred是Mac平台上被很多人吹爆的一款效率提升软件,我刚毕业工作的时候就看到公司内网有人推荐,但没有尝试. 后来我跳槽后自己买 ...
- 实现API管理系统的几个重要关键词
管理API的需求源自于Web API开展业务.从2006年开始,然后逐渐成熟,并在2016年之前进入市场.无论是通过代理现有API的管理网关.本身作为用于部署API本身的网关的一部分,还是作为连接层在 ...
- 以阿里IoT开发物联网和应用平台
1. 链接物联网的概念 物联网(The Internet of Things,简称IOT)是指通过 各种信息传感器.射频识别技术.全球定位系统.红外感应器.激光扫描器等各种装置与技术,实时采集任何需要 ...
- jsp和servlet开发过程中参数传递乱码问题总结
1.前言 相信很多初学者在学习javaWeb基础知识时,总会遇到各种各样的乱码问题,我也是从那个时候过来的.当时遇到各种乱码问题,只能通过面向百度的方式,解决各种乱码问题,乱码虽然问题能解决,但是总是 ...
- Jupter NotebooK学习
1.参考资料 B站上学习视频 Jupyter 安装与使用 2.安装 在cmd窗口中输入(创建的文件会再当前的目录下):pip install jupyter 然后输入:jupyter notebook ...