【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】|廖雪峰官网学习笔记-WSGI接口

本帖来自廖雪峰官网Python教程 Web开发 WSGI接口一个web应用的本质: 1. 浏览器发送 HTTP Request 2. 服务器收到请求,生成HTML文档 3. 服...

廖雪峰Python学习笔记

输入输出 输出: print() print (‘hello, world’) print(‘The quick brown fox’, ‘jum...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

【Python】|廖雪峰官网学习笔记-HTML简介

Web 开发—HTML简介HTML HTML定义了一套语法规则,用来告诉浏览器如何显示我们所见的网页页面。

【Python】|廖雪峰官网学习笔记-HTTP简介

Web 开发—HTTP协议简介HTTP协议 HTML是一种用来定义网页的文本,HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信。

廖雪峰python学习笔记2:表

# -*-coding: utf-8 -*- #Python内置的一种数据结构是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。 classmates = ['Mechael...

廖雪峰python笔记

廖雪峰python笔记廖雪峰python笔记 面向对象高级编程 property作用 使用property面向对象高级编程@property作用 @property广泛应用在类的定义中,可以让调用...

《Git教程-廖雪峰》学习笔记

一.创建版本库 ①初始化一个Git仓库:git init ②添加文件到Git仓库:1.git add ;  2.git commit  二.时光机穿梭 ①查看工作区状态,文件是否被修改过:gi...

JavaScript学习笔记 CH.2 SEC.7 map和set

Map Map是一组键值对的结构,具有极快的查找速度。 举个例子,假设要根据同学的名字查找对应的成绩,如果用Array实现,需要两个Array: var names = ['Michae...

廖雪峰GIT学习笔记

前言 1. git是分布式文件版本管理系统。分布式的东西意味着去中心或者弱化中,也就是git-server万一挂了造成的损失也不会那么可怕。 2. 安装:sudo apt-get install ...
  • edeas
  • edeas
  • 2015-08-26 17:16
  • 828

廖雪峰python教程笔记01

廖雪峰python教程笔记01python基础 Python使用缩进来组织代码块,请务必遵守约定俗成的习惯,坚持使用4个空格的缩进。 在文本编辑器中,需要设置把Tab自动转换为4个空格,确保不混用Ta...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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