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
猜你喜欢
- 本文实例分析了python多线程用法。分享给大家供大家参考。具体如下:今天在学习尝试学习python多线程的时候,突然发现自己一直对supe
- 你知道(X)HTML中最多余的标签中是什么吗?在我看来就是这个<a>标签,不错,就是每个网站使用最多的超级链接标签<a&g
- 1 以下代码的输出结果为:print(round(-3.6))A.-4B.-4.0C.-3D. -3.02 以下代码的输出结果为(Pytho
- 脚本调试第一步:设置中断(鼠标左键点击)第二步:输入中断条件(可选功能,鼠标右键点击红点)第三步:触发中断(当符合条件是,中断被触发)出现中
- 有关JS中字符串的相关文章,现在网上大概不计其数了。这里我不想再就这个问题做过多的论述,只是对几种方式的实现在各种浏览器中的执行效率进行对比
- 本文实例讲述了Python生成rsa密钥对操作。分享给大家供大家参考,具体如下:# -*- coding: utf-8 -*-import
- 对于python的tkinter库来说,如果需要弹出文件选择框,我们需要引入一下tkinter.filedialog包,让用户直观地先择一个
- 具体用法如下: 代码如下:-- ============================================= -- Autho
- <%'使用说明'Dim a'Set a=new CreateExce
- 1、终极方法:条件注释<!--[if lte IE 6]> 这段文字仅显示在 IE6及IE6以下版本。 <![endif]
- 长期以来我就有对几年来交互设计的心得进行总结整理的想法。回到中国来亲身体会到不少同行,主要是交互设计师和视觉设计师对于交互设计的困惑,以及其
- 今天刚接触python,查看了一些环境建立的文章,可能是年代久远很多都不适用,现在mac搭建python环境变得更简单。大神勿喷。首先去py
- 本文实例讲述了python简单实现基数排序算法。分享给大家供大家参考。具体实现方法如下:from random import randint
- 上代码:#coding=utf-8import cv2import dlibpath = "imagePath/9.jpg&quo
- python运行其他程序的实现方法  
- 昨天ie8正式发布了,偶也去下载了一个,感觉很爽, 还在美的时候,突然发现很多网页都出问题,更可气的是自己的网站编辑器eWebEditor也
- php的命名空间功能已经出来很久了,但是一直以来没怎么深究过,这次赶着有时间所以特意翻着手册做一个整理和总结帮助自己完善完善,原本准备一篇写
- HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容
- 反射指的是运行时动态的获取变量的相关信息1. reflect 包类型是变量,类别是常量reflect.TypeOf,获取变量的类型,返回re
- 第一种,也是我最常用的,第一帧里加上这个比较灵活,想要自定义加入菜单,只要定义drMenu这个对象就可以了var drMenu&n