Python学习

时间:2021-6-9 作者:qvyue

第二十二天

Python WSGI(一)

WSGI的全称是Web Server Gateway Interface,翻译过来就是Web服务器网关接口。WSGI 是服务器程序与应用程序的一个约定,它规定了双方各自需要的规范,然后能够配合使用。具体的来说,WSGI是一个规范,定义了Web服务器如何与Python应用程序进行交互,使得使用Python写的Web应用程序可以和Web服务器对接起来。切记WSGI目的为了方便服务器与应用程序配合使用。WSGI协议主要包括server和application两部分,server负责接受客户端请求并进行解析,然后将其传入application,客户端处理请求并将响应头和正文返回服务器。当然其实还需要引入一些中间件(middleware)。
如下图:

1、Web应用

1、浏览器发送一个HTTP请求;

2、服务器收到请求,生成一个HTML文档;

3、服务器把HTML文档作为HTTP响应的Body发送给浏览器;

4、浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示;
我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以我们需要一个统一的接口规范,让我们专心用Python编写Web业务,那么这个接口就是WSGI。

2、WSGI接口

2.1、TCP实现浏览器访问

WSGI协议规范其实是对对socket的封装,首先我们不用wsgi,而是直接使用我们前面说过的socket tcp编程来实现web请求的处理:

import  socket

def req(client):
    #模拟用户请求处理
    req_data = client.recv(1024).decode('gbk')
    print('req_data',req_data)
    msg = 'HTTP/1.1 200 OKrn'
    msg += 'rn'
    msg += '

without WSGI

' client.send(('%s' % msg).encode('gbk')) client.close() def main(): # 1、创建socket tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # #2、绑定监听端口 tcp_server.bind(('127.0.0.1',8080)) # #被动监听listen tcp_server.listen(128) while True: # #3、接收客户端连接 accept方法返回值是元组 accept()阻塞方法 client_conn, client_addr = tcp_server.accept() print("客户端的ip地址和端口号:", client_addr) req(client_conn) #关闭socket tcp_server.close() if __name__ == '__main__': main()

浏览器输入 127.0.0.1:8080就会显示 without WSGI!!

2.2、WSGI实现

WSGI接口实现其实很简单,我们只需要实现一个函数,就可以响应HTTP请求:

def application(environ, start_response):
      start_response('200 OK',[('Content-Type','text/html')])
      return '

with WSGI

'

application函数是WSGI标准的一个HTTP处理函数,两个参数:
1、environ、一个包含HTTP所有信息的dict对象
2、start_response、一个发送HTTP响应的函数
注意:
1、application函数本身没有涉及解析HTTP,将底层web服务器解析和应用程序逻辑分离;
2、正常情况下application函数由WSGI服务器调用,不是我们自己调用;
这里我们修改上述程序简单看下WSGI使用:

from wsgiref.simple_server import make_server

def wsgi_request(environment,response):
    response('200 OK',[('Content-Type','text/html')])
    data = '

WITH WSGI

' return [data.encode('gbk')] if __name__ == '__main__': http = make_server('127.0.0.1',8080,wsgi_request) print('程序运行') http.serve_forever()

浏览器上输入127.0.0.1:8080显示WITH WSGI!!
make_server:监听在本地的端口上,接受来自客户端的请求使用默认的
server_class=WSGIServer, handler_class=WSGIRequestHandler类来启动
我们的服务器。然后等待处理客户端的请求。

3、最后

要使用WSGI,需要存在server角色和application角色。Application端的实现一般是由Python的各种框架来实现的,对于开发者而言,一般不需要关心WSGI的实现,框架会会提供接口让开发者获取HTTP请求的内容以及发送HTTP响应。Server端的实现会比较复杂一点,一般常用的Web服务器,如Apache和nginx,都不会内置WSGI的支持,而是通过扩展来完成,这个我们后面会涉及到。

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。