python3.x兼容python2.x吗(Python WSGI学习总结-API接口开发)python初学 / python在API设计与开发中的应用...

wufei123 发布于 2024-05-28 阅读(15)

1.WHAT?(什么是wsgi,它用来做什么?)WSGI的全称是Web Server Gateway Interface,翻译过来就是Web服务器网关接口具体的来说,WSGI是一个规范,定义了Web服务器如何与Python应用程序进行交互,使得使用Python写的Web应用程序可以和Web服务器对接起来。

WSGI一开始是在PEP-0333中定义的,最新版本是在Python的PEP-3333定义的那么,它实现了那些功能,用来做什么?操作 wsgi 的环境变量应答头部的处理实现简单的 HTTP server

python3.x兼容python2.x吗(Python WSGI学习总结-API接口开发)python初学 / python在API设计与开发中的应用...

简单的对程序端和服务器端校验函数WSGI 是服务器程序与应用程序的一个约定,它规定了双方各自需要实现什么接口,提供什么功能,以便二者能够配合使用WSGI 不能规定的太复杂,否则对已有的服务器来说,实现起来会困难,不利于WSGI的普及。

同时WSGI也不能规定的太多,例如cookie处理就没有在WSGI中规定,这是为了给框架最大的灵活性要知道WSGI最终的目的是为了方便服务器与应用程序配合使用,而不是成为一个Web框架的标准另一方面,WSGI需要使得middleware(是中间件么?)易于实现。

middleware处于服务器程序与应用程序之间,对服务器程序来说,它相当于应用程序,对应用程序来说,它相当于服务器程序这样,对用户请求的处理,可以变成多个 middleware 叠加在一起,每个middleware实现不同的功能。

请求从服务器来的时候,依次通过middleware,响应从应用程序返回的时候,反向通过层层middleware我们可以方便地添加,替换middleware,以便对用户请求作出不同的处理WSGI协议分为两部分,分别为WSGI Server和WSGI Application,WSGI Server负责接受客户端请求、解析请求、并按照协议规范将请求转发给WSGI Application,同时负责接受WSGI Application的响应并发送给客户端;WSGI Application负责接受由WSGI Server发送过来的请求,实现业务处理逻辑,并将标准的响应发回给WSGI Server:

具体来说,WSGI Server解析客户端由socket发送过来的http数据包,将请求的http version、method、host、path等包装成environ参数,并提供start_response回调函数,并将environ和

start_response函数作为参数传递给由WSGI Application提供的callable对象,获取callable对象的返回结果,处理后依照http协议传递给客户端,完成一次请求它更像是一个客户端(浏览器)和服务器(服务器后端,具体处理请求,返回用户请求数据)之间的桥梁,在这个桥梁使用的过程中可以给他加一些其他自己需要的基础设施(插件)。

WSGI 内容概要WSGI主要是对应用程序与服务器端的一些规定,所以,它的主要内容就分为两个部分应用程序WSGI规定:1. 应用程序需要是一个可调用的对象在Python中:可以是函数可以是一个实例,它的类实现了__call__方法。

可以是一个类,这时候,用这个类生成实例的过程就相当于调用这个类同时,WSGI规定:2. 可调用对象接收两个参数# callable functiondefapplication(environ, start_response)

:pass2.HOW?(它是怎么实现所提供的功能的,我们在项目中怎么用?)一条 HTTP 请求的旅程:服务器端启动服务,等到客户端输入 curl -i http://localhost:8000/ 命令,摁下回车键,看到终端上的输出,整个过程中,wsgi 的服务器端发生了什么呢?

服务器程序创建 socket,并监听在特定的端口,等待客户端的连接客户端发送 http 请求socket server 读取请求的数据,交给 http serverhttp server 根据 http 的规范解析请求,然后把请求交给 WSGIServer

WSGIServer 把客户端的信息存放在 environ 变量里,然后交给绑定的 handler 处理请求HTTPHandler 解析请求,把 method、path 等放在 environ,然后 WSGIRequestHandler 把服务器端的信息也放到 environ 里

WSGIRequestHandler 调用绑定的 wsgi ServerHandler,把上面包含了服务器信息,客户端信息,本次请求信息得 environ 传递过去wsgi ServerHandler 调用注册的 wsgi app,把 environ 和 start_response 传递过去

wsgi app 将reponse header、status、body 回传给 wsgi handler然后 handler 逐层传递,最后把这些信息通过 socket 发送到客户端客户端的程序接到应答,解析应答,并把结果打印出来。

一个简单的案例:# coding:utf-8import json from wsgiref.simple_server import make_server import mysql.connector mydb = mysql.connector.connect( host=

"localhost", user="root", passwd="123456", database="dmp" ) defmy_db(sql): mycursor = mydb.cursor() mycursor.execute(sql) print(sql)

if sql.strip()[:6] == select: res = mycursor.fetchone() else: res = mycursor.fetchone() mydb.commit() mycursor.close()

return res # 定义函数,参数是函数的两个参数,都是python本身定义的,默认就行了defapplication(environ, start_response):# 定义文件请求的类型和当前请求成功的code。

start_response(200 OK, [(Content-Type, application/json)]) # environ是当前请求的所有数据,包括Header和URL,body

# 获取请求中的Body文件内容 request_body = environ["wsgi.input"].read(int(environ.get("CONTENT_LENGTH", 0))) request_body = json.loads(request_body) print(request_body)

#{username: grea1345, password: 1234, points: 121}#获取请求中的Body字段 username = request_body["username"

] pwd = request_body["password"] points = request_body["points"] if username and pwd: sql=

"select username from Users where username = %s;"%username result=my_db(sql) #print(result)

if result: res = "Msg:User Exists already, please login directly,msg_code:2001"#print(res)

else: insert_sql = "insert into Users(Username,Pwd,points)values(%s,%s,%s);"%(username,pwd,points) my_db(insert_sql) res =

"msg: Register Successfully, msg_code: 0"#print(res)else: res = "msg: Username and Pwd could not be null, msg_code: 1001"

#print(res)return [res] if __name__ == "__main__": port = 9003 httpd = make_server("127.0.0.1"

, port, application) print("serving http on port {0}...".format(str(port))) httpd.serve_forever()

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻33411