关于python:PythonWSGI接口

39次阅读

共计 2954 个字符,预计需要花费 8 分钟才能阅读完成。

Python WSGI 规定了 Web 服务器和 Python Web 应用程序或 Web 框架之间的标准接口,次要是为了促成 Web 应用程序在各种 Web 服务器上的可移植性。

上述这句话翻译自 Python 官网的 PEP333 规范:PEP 333 — Python Web Server Gateway Interface v1.0

WSGI 接口概述

WSGI 的含意:Web Server Gateway Interface(Web 服务器网管接口)。

WSGI 接口蕴含两方面:server/gateway 端 及 application/framework 端。前面间接应用 server 和 application 来阐明,不再应用 gateway 和 framework。server 端间接调用 application 端提供的 可调用对象。另外在 server 和 application 之间还能够有一种称作 middleware 的中间件。中间件对于 server 来说就是一个 application,然而对于 application 来说中间件却是一个 server。

上述可调用对象是指:函数、办法、类或者带有 __call__ 办法的实例。

以下别离介绍 application 端,Server 端和 middleware 三个局部

<!–more–>

Application 端

函数、办法、类及带有 callable 办法的实例等可调用对象都能够作为 application 对象。application 对象承受两个参数并且能够被屡次调用。

参数

  • environ:environ 参数是一个字典对象,该对象必须是内置的 Python 字典,应用程序能够任意批改该字典。字典还必须蕴含某些 WSGI 必须的变量。
  • start_response:由 server 提供的回调函数,其作用是由 application 将状态码和响应头返回给 server。这个函数有两个必须的地位参数和一个可选参数,三个参数别离为 status,response_headers 和 exc_info

start_response 的三个参数的意义如下:

  • status:HTTP 响应码及音讯,例如 status = ‘200 OK’
  • response_headers:提供给客户端的响应头,须要封装成 list of tuple pairs 的模式
response_headers = [('Content-Type', 'text/plain'), ('Content-Length', str(len(response_body)))]
  • exc_info:Python sys.exc_info()元组

返回值

application 对象必须返回一个响应体,响应体的模式是 list of str,也就是说返回值是由一个或多个字符串组成的列表。

以下是一个函数作为 application 对象的例子

def simple_app(environ, start_response):
    """最简略的 application 对象"""
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return ['Hello world!\n']

以下是一个类作为 application 对象的例子

class AppClass:
    """
    AppClass()会返回一个 AppClass 类对象作为 application,而后在迭代的时候就会调用__iter__办法,而后就能够产生雷同的输入。如果咱们也能够实现__call__办法间接将实例当做 application
    """

    def __init__(self, environ, start_response):
        self.environ = environ
        self.start = start_response

    def __iter__(self):
        status = '200 OK'
        response_headers = [('Content-type', 'text/plain')]
        self.start(status, response_headers)
        yield "Hello world!\n"

Server 端

WSGI server 必须要调用 application,而且要应用地位参数的模式调用 application。同时,从 application 的协定要求可知:

  • WSGI server 必须向 application 提供环境参数,因而,本身也必须可能获取环境参数。
  • WSGI server 接管 application 的返回值作为响应体。

最简略的 WSGI server 为 Python 自带的 wsgiref.simple_server。

代码

from wsgiref.simple_server import make_server
server = make_server('localhost', 8080, application)
server.serve_forever()

Middleware

中间件位于 WSGI server 和 WSGI application 之间,对于中间件的局部代码参考:

  • An Introduction to the Python Web Server Gateway Interface (WSGI)

代码如下

from wsgiref.simple_server import make_server

def application(environ, start_response):

    response_body = 'hello world!'

    status = '200 OK'

    response_headers = [('Content-Type', 'text/plain'),
        ('Content-Length', str(len(response_body)))
    ]

    start_response(status, response_headers)
    return [response_body]

# 中间件
class Upperware:
   def __init__(self, app):
      self.wrapped_app = app

   def __call__(self, environ, start_response):
      for data in self.wrapped_app(environ, start_response):
        yield data.upper()

wrapped_app = Upperware(application)

httpd = make_server('localhost', 8051, wrapped_app)

httpd.serve_forever()

print 'end'

记得帮我点赞哦!

精心整顿了计算机各个方向的从入门、进阶、实战的视频课程和电子书,依照目录正当分类,总能找到你须要的学习材料,还在等什么?快去关注下载吧!!!

朝思暮想,必有回响,小伙伴们帮我点个赞吧,非常感谢。

我是职场亮哥,YY 高级软件工程师、四年工作教训,回绝咸鱼争当龙头的斜杠程序员。

听我说,提高多,程序人生一把梭

如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个激励,将不胜感激。

职场亮哥文章列表:更多文章

自己所有文章、答复都与版权保护平台有单干,著作权归职场亮哥所有,未经受权,转载必究!

正文完
 0