首页 > 编程 > Python > 正文

Python模块WSGI使用详解

2020-02-22 23:05:49
字体:
来源:转载
供稿:网友

WSGI(Web Server Gateway Interface):Web服务网关接口,是Python中定义的服务器程序和应用程序之间的接口。

Web程序开发中,一般分为服务器程序和应用程序。服务器程序负责对socket服务的数据进行封装和整理,而应用程序则负责对Web请求进行逻辑处理。

Web应用本质上也是一个socket服务器,用户的浏览器就是一个socket客户端。

我们先用socket编程实现一个简单的Web服务器:

import socket  def handle_request(client):   buf = client.recv(1024)   print(buf)   msg = "HTTP/1.1 200 OK/r/n/r/n" #HTTP头信息   client.send(('%s' % msg).encode())   msg = "Hello, World!"   client.send(('%s' % msg).encode())  def main():   ip_port = ("localhost", 8000)   sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   sock.bind(ip_port)   sock.listen(5)    while True:     conn, addr = sock.accept()     handle_request(conn)     conn.close()  if __name__ == "__main__":   main() 

上述代码中,main()函数就是服务器函数,handle_request()就是应用程序。
下面我们再用python的wsgiref模块来实现跟上述代码一样的Web服务器:

from wsgiref.simple_server import make_server  def handle_request(env, res):   res("200 OK",[("Content-Type","text/html")])   body = "<h1>Hello World!</h1>"   return [body.encode("utf-8")]  if __name__ == "__main__":   httpd = make_server("",8000,handle_request)   print("Serving http on port 80000")   httpd.serve_forever() 

上面两份代码实现的效果是一样的,调用wsgiref模块则明显节省了代码量,是整个程序更加简洁。
wsgiref模块封装了socket服务端的代码,只留下一个调用的接口,省去了程序员的麻烦,程序员可以将精力放在Web请求的逻辑处理中。

以上述的代码为例,详细看一下wsgiref模块的源码中一些关键的地方:

if __name__ == "__main__":   httpd = make_server("",8000,handle_request)   print("Serving http on port 80000")   httpd.serve_forever() 

1、整个程序的入口为make_server()函数:

def make_server(host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler):   """Create a new WSGI server listening on `host` and `port` for `app`"""   server = server_class((host, port), handler_class) #默认创建一个WSGIServer类   server.set_app(app) #将应用程序,即逻辑处理函数传给类   return server 

2、make_server()函数默认生成一个WSGIServer类:

class WSGIServer(HTTPServer):
class HTTPServer(socketserver.TCPServer):
class TCPServer(BaseServer):

WSGIServer,HTTPServer两个类没有初始化函数,调用父类的初始化函数,TCPServer类的__init__()函数拓展了BaseServer

类的__init__()函数:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表