您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:python 内置库wsgiref的使用(WSGI基础入门)

51自学网 2021-10-30 22:29:49
  python
这篇教程python 内置库wsgiref的使用(WSGI基础入门)写得很实用,希望能帮到您。

WSGI基本原理

1. WSGI处理过程

  1. 浏览器到WSGI Server:浏览器发送的请求会先到WSGI Server。
  2. environ:WSGI Server会将HTTP请求中的参数等信息封装到environ(一个字典)中。
  3. WSGI Server到WSGI App:App就是我们自己编写的后台程序,每个URL会映射到对应的入口处理函数(或其他可调用对象),WSGI Server调用后台App时,会将environ和WSGI Server中自己的一个start_response函数注入到后台App中。
  4. 逻辑处理:后台函数(或其他可调用对象)需要接收environ和start_response,进行逻辑处理后返回一个可迭代对象,可迭代对象中的元素为HTTP正文。
  5. WSGI App到WSGI Server:后台函数处理完后,会先调用start_response函数将HTTP状态码、报文头等信息(响应头)返回给WSGI Server,然后再将函数的返回值作为HTTP正文(响应body)返回给WSGI Server。
  6. 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,返回响应头部。
  • 返回包含正文的可迭代对象。

以上就是python 内置库wsgiref的使用(WSGI基础入门)的详细内容,更多关于python wsgiref的使用的资料请关注51zixue.net其它相关文章!


利用Python通过获取剪切板数据实现百度划词搜索功能
教你如何利用python进行数值分析
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。