• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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服务器

    WSGI应用程序

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

    您可能感兴趣的文章:
    • Python实现socket库网络通信套接字
    • Python标准库之typing的用法(类型标注)
    • Python趣味挑战之turtle库绘画飘落的银杏树
    • 让文件路径提取变得更简单的Python Path库
    • 关于python3安装pip及requests库的导入问题
    • Python的这些库,你知道多少?
    上一篇:利用Python通过获取剪切板数据实现百度划词搜索功能
    下一篇:教你如何利用python进行数值分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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