纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

python wsgiref的使用 python 内置库wsgiref的使用(WSGI基础入门)

山上下了雪-bky   2021-06-07 我要评论
想了解python 内置库wsgiref的使用(WSGI基础入门)的相关内容吗山上下了雪-bky在本文为您仔细讲解python wsgiref的使用的相关知识和一些Code实例欢迎阅读和指正我们先划重点:python,wsgiref,python,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返回响应头部
  • 返回包含正文的可迭代对象

相关文章

猜您喜欢

  • 如何使用ReactiveObjC 详解怎样使用ReactiveObjC

    想了解详解怎样使用ReactiveObjC的相关内容吗为童沉沦在本文为您仔细讲解怎样使用ReactiveObjC的相关知识和一些Code实例欢迎阅读和指正我们先划重点:IOS,ReactiveObjC下面大家一起来学习吧..
  • python数值分析 教你怎样利用python进行数值分析

    想了解教你怎样利用python进行数值分析的相关内容吗zhshuai1在本文为您仔细讲解python数值分析的相关知识和一些Code实例欢迎阅读和指正我们先划重点:python数值分析的用法,python数值分析下面大家一起来学习吧..

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式