【Python】|廖雪峰官网学习笔记-WSGI接口

原创 2016年08月29日 17:26:56

本帖来自廖雪峰官网Python教程

Web开发


WSGI接口

一个web应用的本质:

1. 浏览器发送 HTTP Request
2. 服务器收到请求,生成HTML文档
3. 服务器返回HTTP Response(HTML文档作为HTTP Response的Body部分 )
4. 浏览器收到HTTP Response,从HTTP Body取出HTML文档并显示

所以,最简单的web应用就是先把HTML用文件保存好,用一个现成的HTTP服务软件,接受用户请求,从文件中读取HTML,返回。

底层代码(接受HTTP请求、解析HTTP请求、发送HTTP响应)由专门的服务器软件实现,我们用Python专注于生成HTML文档,这时就需要一个统一的接口,供我们用Python编写Web业务。

这个接口就是WSGI:Web Sever Gateway Interface。 它只需要实现一个函数,就能够相应HTTP请求:

def application(environ,start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'<h1>Hello, web!</h1>']

上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接受两个参数:

  • environ: 包含所有HTTP request的dict对象

  • start_response: 一个发送HTTP Response的函数

在application()函数中,调用:

start_response('200 OK', [('Content-Type', 'text/html')])

发送一个HTTP相应的Header,但是只能发送一次,就是只能调用一次start_response()函数。start_response()函数接受两个参数:

  • 200 OK: HTTP响应码。

  • [('Content-Type', 'text/html')]: 一组list表示的HTTP Header,每个Header是一个tuple,包含两个str

通过WSGI,省掉了底层的繁杂步骤,我们只需关心如何从environ拿到HTTP请求信息,然后构造HTML,通过start_response()发送Header,最后返回Body。

要调用application()必须由WSGI服务器调用,Python内置了wsgiref.py作为WSGI服务器。


为了方便理解,将上面的文字整理成了一张图:

这里写图片描述

有了上面的介绍过后,就可以运行WSGI服务了,用来实现web应用。


运行WSGI服务

首先编写hello.py,实现Web应用程序的WSGI处理函数:

# hello.py

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'<h1>Hello, web!</h1>']

然后,编写一个sever.py,负责启动WSGI服务器,加载application()函数:

# server.py
# 从wsgiref模块导入:
from wsgiref.simple_server import make_server
# 导入我们自己编写的application函数:
from hello import application

# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()

确保以上两个文件在同一目录下,先在命令行运行sever.py,再在浏览器输入localhost:8000,运行结果如下:

成功启动服务器:

这里写图片描述

浏览器显示:

这里写图片描述

服务器端显示:

这里写图片描述


总结

无论什么Web应用程序,入口都是一个WSGI处理函数。HTTP请求的所有输入信息都可以通过environ获得,HTTP响应的输出都可以通过start_response()加上函数返回值作为Body。

对于复杂的Web应用程序,光靠WSGI函数来处理太底层了,需要在WSGI之上再抽象出Web框架,进一步简化Web开发。

版权声明:欢迎转载,请注明出处。

Python学习笔记- 廖雪峰教程【python 2】//为继续学习爬虫准备-02 [待完善]

装饰器的作用: 1 简化代码,避免每个函数编写重复性代码:打印日志@log,检测性能 @performance,数据库事务 @transaction,URL路由@post('/register') ...
  • NaomiEdna
  • NaomiEdna
  • 2016年09月24日 21:01
  • 1516

廖雪峰Python教程学习笔记

廖雪峰写了一个Python教程,比较基础,文风也比较口语化,阅读学习体验都不错,推荐给需要者。 本博文记录阅读该教程的一些总结和遇到的问题。 1. 在dict和set中使用tuple 事实证明...
  • zhuanzhu123
  • zhuanzhu123
  • 2015年10月18日 16:39
  • 2672

简单的WSGI例子

原文转自廖雪峰官网:WSGI接口 了解了HTTP协议和HTML文档,我们其实就明白了一个Web应用的本质就是: 浏览器发送一个HTTP请求; 服务器收到请求,生成一个HTML文档; 服务器把HTML文...
  • violet_echo_0908
  • violet_echo_0908
  • 2016年08月23日 16:47
  • 878

廖雪峰《Python3 基础教程》读书笔记——第三章

第一章Python基础 Python使用缩进来组织代码块,请务必遵守约定俗成的习惯,坚持使用4个空格的缩进。 在文本编辑器中,需要设置把Tab自动转换为4个空格,确保不混用Tab和空格。 3.1 数据...
  • wxfsjtu
  • wxfsjtu
  • 2017年08月01日 16:05
  • 406

python学习(一) 根据廖雪峰老师的资料进行自学

因为整数和浮点数在计算机内部储存方式不同 所以说 整数的运算是精确的(包括整数的除法) 然而浮点数的运算是存在四舍五入的误差的 在python中 None是一个特殊的值,不代表0,是个特殊的空值 ...
  • mbypineapple
  • mbypineapple
  • 2016年09月08日 19:03
  • 623

廖雪峰python学习笔记——函数式编程

廖雪峰python学习笔记——函数式编程 变量可以指向函数 a=abs a(-2) #输出2 高级函数就是一个可以把一个函数当成参数的函数 def add(x,y,f): return f(x...
  • xiakepan
  • xiakepan
  • 2016年01月21日 13:47
  • 1600

git笔记 (根据廖雪峰git教程整理)

创建版本库 初始化一个Git仓库,使用git init命令。 添加文件到Git仓库,分两步: 第一步,使用命令git add ,注意,可反复多次使用,添加多个文件...
  • u012804178
  • u012804178
  • 2016年07月27日 14:52
  • 1666

Python廖雪峰实战web开发(Day14-完成Web App)

完成WebApp
  • qq_38801354
  • qq_38801354
  • 2017年06月22日 19:44
  • 426

Git学习(廖雪峰的Git教程)笔记

1.Git是什么? 一直在自己电脑里就一个文件的反复修改,添加。好长时间的精力都在里面,突然有一天手残写坏了,而且Ctrl+Z不再能当做后悔药来用。一个词形容:欲哭无泪。 突然有一天发现了Git,可以...
  • liyuxing6639801
  • liyuxing6639801
  • 2017年03月14日 22:52
  • 404

廖雪峰python教程实战 Day 3 - 编写ORM

Day3-编写ORM1.设计思路 在一个Web App中,所有的数据,包括用户信息,用户发布的日志,评论都放在数据库中,本次实战使用MySQL作为数据库。 Web App中,有许多地方都要用到数据库,...
  • weixin_39549890
  • weixin_39549890
  • 2017年07月22日 09:54
  • 398
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Python】|廖雪峰官网学习笔记-WSGI接口
举报原因:
原因补充:

(最多只允许输入30个字)