python 内置库wsgiref的使用(WSGI基础入门)
作者:山上下了雪-bky 发布时间:2021-09-15 21:33:30
目录
WSGI基本原理
1. WSGI处理过程
2. WSGI示例
3. WSGI web服务器和应用程序
WSGI基本原理
1. WSGI处理过程
浏览器到WSGI Server:浏览器发送的请求会先到WSGI Server。
environ:WSGI Server会将HTTP请求中的参数等信息封装到environ(一个字典)中。
WSGI Server到WSGI App:App就是我们自己编写的后台程序,每个URL会映射到对应的入口处理函数(或其他可调用对象),WSGI Server调用后台App时,会将environ和WSGI Server中自己的一个start_response函数注入到后台App中。
逻辑处理:后台函数(或其他可调用对象)需要接收environ和start_response,进行逻辑处理后返回一个可迭代对象,可迭代对象中的元素为HTTP正文。
WSGI App到WSGI Server:后台函数处理完后,会先调用start_response函数将HTTP状态码、报文头等信息(响应头)返回给WSGI Server,然后再将函数的返回值作为HTTP正文(响应body)返回给WSGI Server。
WSGI Server到浏览器:WSGI Server将从App中得到的所有信息封装为一个response返回给浏览器。
2. WSGI示例
wsgiref简单示例
运行以下示例程序后,在浏览器中输入以http://127.0.0.1:9999/开头的随意一个url都可以看到返回结果。实例程序中所有url都会以同一个App进行处理,实际生产环境中不同的url肯定是需要映射到不同的App上的,但这部分本文不作讲解。
# wsgiref是Python自带的内置库,它用来开发者对wsgi进行测试用的,不可以用在生产环境中
from wsgiref.simple_server import make_server, demo_app
# wsgi也是基于socket server编写
# 默认情况下会将所有url都传入demo_app进行处理,具体可参考demo_app源码
# app参数可以是任何可调用对象,但是内部处理需要参考demo_app源码,即environ处理、start_response调用、返回值类型
ws = make_server('127.0.0.1', 9999, demo_app)
# 启动服务
ws.serve_forever()
demo_app源码
def demo_app(environ,start_response):
from io import StringIO
stdout = StringIO()
print("Hello world!", file=stdout)
print(file=stdout)
# environ是一个字典,包含了所有请求信息
h = sorted(environ.items())
for k,v in h:
print(k,'=',repr(v), file=stdout)
# return之前需要调用start_response设置响应头信息
start_response("200 OK", [('Content-Type','text/plain; charset=utf-8')])
return [stdout.getvalue().encode("utf-8")] # 一个可迭代对象,元素为byte类型,元素内容依据start_response中指定的Content-Type来指定
demo_app类定义的两种方式
# 第一种方式:定义类的__init__和__iter__方法,前者用来接收和处理environ和start_response,后者生成一个可迭代对象
# make_server中app参数只需传入类名即可
class ApplicationClass:
def __init__(self, environ, start_response):
self.e = environ
self.sr = start_response
def __iter__(self):
from io import StringIO
stdout = StringIO()
print("Hello world!", file=stdout)
print(file=stdout)
h = sorted(self.e.items())
for k, v in h:
print(k, '=', repr(v), file=stdout)
self.sr("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
yield from [stdout.getvalue().encode("utf-8")]
# 第二种方式:定义__call__方法,接收和处理environ和start_response,并返回一个可迭代对象
# make_server中app参数需要传入类的实例
class ApplicationInstance:
def __call__(self, environ, start_response):
from io import StringIO
stdout = StringIO()
print("Hello world!", file=stdout)
print(file=stdout)
h = sorted(environ.items())
for k, v in h:
print(k, '=', repr(v), file=stdout)
start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
return [stdout.getvalue().encode("utf-8")]
3. WSGI web服务器和应用程序
WSGI web服务器
本质上是一个TCP服务器,监听在特定的端口上。
支持HTTP协议,能够解析HTTP请求报文,能够按HTTP协议将响应数据封装为报文并返回给浏览器。
实现了WSGI协议,该协议约定了和应用程序之间的接口,即url到app之间的映射。
WSGI应用程序
遵从WSGI协议。
本身是一个可调用对象。
调用start_response,返回响应头部。
返回包含正文的可迭代对象。
来源:https://www.cnblogs.com/guyuyun/p/14856939.html


猜你喜欢
- 1、解压到想要安装的位置,创建my.ini文件my.ini的内容如下[mysql]# 设置mysql客户端默认字符集default-char
- 前两天看见有人问静态网页加密问题,就写了这个代码稍微有些长,解释一下思路:加密时:先把用户的密钥A用md5加密为B,然后用B异或源文件S0得
- 微博上讨论MySQL在删除大表engine=innodb(30G+)时,如何减少MySQL hang的时间,现做一下简单总结: 当buffe
- SNMP标准引入一组ASN.1语言元素,称之为SMI(Structure of Management Information)。由SMI描述
- 在MySQL数据库中导出整个数据库:1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldu
- 写入文件使用open()函数和write()函数但是有两种写法,分别是'a'和'w'。'a'
- 1.语法规则1-1 代码实例sorted(iterable, key=None,reverse=False)1-2 参数说明(1)itera
- 使用fso对象遍历指定文件夹函数:'遍历文件夹sub ListFolderContents(path) &nbs
- 工作中同事遇到此异常,查找解决问题时,收集整理形成此篇文章。问题场景问题出现环境:1、在同一事务内先后对同一条数据进行插入和更新操作;2、多
- 本文实例讲述了php实现通过cookie换肤的方法。分享给大家供大家参考。具体如下:saveStyleSheet.php页面如下:<?
- 本文实例讲述了Python递归遍历列表及输出的实现方法。分享给大家供大家参考。具体实现方法如下:def dp(s): if is
- 1.init 函数简介Golang init 函数是一种特殊的函数,主要用于完成程序的初始化工作,如初始化数据库的连接、载入本地配置文件、根
- 问题出现在当时后台数据会返回到data中但是没有出现下拉菜单,查询资料 发现 Vue的this理解有误jsp 下拉菜单 <select
- Vue.js 的各种指令(Directives)更加方便我们去数据驱动 DOM,例如 v-bind、v-on、v-model、v-if、v-
- 前言运用pandas 库对所得到的数据进行数据清洗,复习一下相关的知识。1 数据清洗1.1 处理缺失数据对于数值型数据,分为缺失值(NAN)
- 说明本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用python实现的,
- 转:coolcode.cn前几天写了一篇在任意字符集下正常显示网页的方法,里面介绍的很简单,就是把前128个字符以外的字符集都用
- 下面是虚机维护中,经常碰到的一些ASP程序中的数据库调用的错误,现收集整理如下:
- 作者|Nicholas Ballard编译|VK来源|Towards Data Science可以说,每一个“使用计算机的人”都需要在某个时
- 前言:由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式。即同一个列中存储了多个属性值(具体结构见下表)。这种模式下,应