当前位置: 首页 > 后端技术 > Python

Python-WSGI接口

时间:2023-03-26 11:44:03 Python

PythonWSGI规定了Web服务器与PythonWeb应用程序或Web框架之间的标准接口,主要是为了方便Web应用程序在各种Web服务器上的可移植性。上面这句话翻译自Python官方的PEP333标准:PEP333--PythonWebServerGatewayInterfacev1.0WSGI接口概述WSGI的含义:WebServerGatewayInterface(Web服务器网络管理接口)。WSGI接口包括两个方面:服务器/网关和应用程序/框架。server和application后面会直接用到讲解,gateway和framework就不再用了。服务器端直接调用应用程序端提供的可调用对象。此外,在服务器和应用程序之间可以有一个称为中间件的中间件。中间件是服务端的应用程序,而中间件是应用程序的服务端。上述可调用对象是指具有__call__方法的函数、方法、类或实例。下面分别介绍应用端、服务端和中间件三部分。应用程序端函数、方法、类和具有可调用方法的实例可以用作应用程序对象。应用程序对象接受两个参数,可以多次调用。参数environ:environ参数是一个字典对象,必须是Python内置的字典,应用程序可以任意修改字典。该字典还必须包含某些WSGI所需的变量。start_response:服务端提供的回调函数,其作用是应用程序向服务端返回状态码和响应头。该函数有两个必需的位置参数和一个可选参数。三个参数分别是status、response_headers和exc_infostart_response。三个参数的含义如下:status:HTTP响应码和消息,例如status='200OK'response_headers:提供给客户端的响应头需要封装成一个元组对列表response_headers=[('Content-Type','text/plain'),('Content-Length',str(len(response_body)))]exc_info:Pythonsys.exc_info()tuplereturnvalue应用对象必须返回一个响应体,格式为oflistofstr,也就是说,返回值是由一个或多个字符串组成的列表。下面是一个函数作为应用对象的例子defsimple_app(environ,start_response):"""最简单的应用对象"""status='200OK'response_headers=[('Content-type','text/plain')]start_response(status,response_headers)return['Helloworld!\n']下面是一个类作为应用对象类AppClass的例子:"""AppClass()将返回一个AppClass对象作为应用,并且然后迭代调用__iter__方法,然后产生相同的输出。如果我们也可以实现__call__方法,直接把实例当作应用"""def__init__(self,environ,start_response):self.environ=environself.start=start_responsedef__iter__(self):status='200OK'response_headers=[('Content-type','text/plain')]self.start(status,response_headers)yield"Helloworld!\n"服务器端的WSGI服务器必须调用应用程序,应用程序必须是同时从应用程序的协议要求可以看出,WSGI服务器必须向应用程序提供环境参数,所以它必须能够自己获取环境参数。服务器接收应用程序的返回值作为响应体,最简单的WSGI服务器是Python自带的wsgiref.simple_server。Codefromwsgiref.simple_serverimportmake_serverserver=make_server('localhost',8080,application)server.serve_forever()中间件中间件位于WSGI服务器和WSGI应用程序之间,关于中间件的一些代码参考:AnIntroductiontothePythonWebServerGatewayInterface(WSGI)代码如下fromwsgiref.simple_serverimportmake_serverdefapplication(environ,start_response):response_body='helloworld!'status='200OK'response_headers=[('Content-Type','text/plain'),('Content-Length',str(len(response_body)))]start_response(status,response_headers)return[response_body]#中间件类Upperware:def__init__(self,app):self.wrapped_app=appdef__call__(self,environ,start_response):fordatainself.wrapped_app(environ,start_response):yielddata.upper()wrapped_app=Upperware(application)httpd=make_server('localhost',8051,wrapped_app)httpd.serve_forever()print'end'记得给我点赞哦!从入门、进阶、实战各个方向精心整理出计算机各个方向的视频课程和电子书,按照目录合理分类,总能找到。你需要的学习资料,你还在等什么?立即关注并下载!!!念念不忘,必有回响,朋友们,点个赞吧,非常感谢职场亮哥,YY资深软件工程师,四年工作经验,不服的斜杠程序员成为领导者。听我说,我进步很大。如果有幸帮到你,请给我一个【点赞】,给我一个关注,如能评论鼓励,将不胜感激。职场凉阁文章列表:更多文章我的所有文章和回答均与版权保护平台合作,版权归职场凉阁所有。未经授权转载必究!