当前位置:网站首页>浅析WSGI协议
浅析WSGI协议
2022-08-05 09:41:00 【51CTO】
导语
在总结Python项目部署的细节时,粗略的写过有关WSGI协议的内容,接下来这篇讲讲有关WSGI设计思路,以及如何手写一个WSGI的应用程序?
什么是WSGI协议?WSGI的作用?
WSGI不是Python模块,框架,API,本质来讲就是Web服务器和Web应用程序通信的接口规范,也能理解为提供一个相对简单但全面的接口,用来支持Web服务器和Web应用程序交互;
WSGI
WSGI协议主要分为Server(服务器)和Application(应用程序)两部分:
- Server(服务器):从客户端接收请求,将请求传给应用程序处理,然后将应用程序处理后返回的响应,发送给客户端;
- Application(应用程序):接收从WSGI服务器发送的请求,处理请求,并将处理后的响应结果返回给服务器;
APPlication(应用程序)
Application(应用程序)必须是一个可调用的对象(函数,或者是实现了__call__方法的类),接收两个参数,environ(WSGI的环境信息)和start_response(发送HTTP响应请求的函数),应用程序最后需要返回一个iterable,包含单个或者多个bytestring。
备注:
- environ变量是包含了环境信息的字典;
- start_response也是一个可调用对象,设置响应请求的状态码和响应头;
- 参数名称不一定要求是environ,start_response,要求服务器传入的是位置参数而非关键字参数;
Server(服务器)
Server(服务器)负责解析HTTP请求,并且将请求发送给应用程序处理。Python中有内置的wsgiref模块,可以直接生成一个WSGI服务器(仅供开发测试)。
备注:
- 创建一个WSGI服务器,监听8000端口,指定make_app函数处理请求;
- serve_forever轮询等待请求,直到shutdown()请求;
模拟Get/Post请求解析
上述简单的模拟Get请求到WSGI服务器,然后返回一个HTML的过程,下面模拟解析Get请求参数,解析Post的json参数
GET请求解析:
备注:
- 检查environ字典中的REQUEST_METHOD,判断请求方式,如果请求方式不为GET,返回405状态页面;
- 检查environ字典中的PATH_INFO,判断请求路径是否合法,当路径不在预设的列表中,则返回404状态页面;
- 通过parse_qs解析environ字典中的QUER_STRING字符串,判断能否获取对应的请求参数name;
Post请求解析:
备注:
- 模拟POST请求提交json数据,获取提交的json数据需要通过environ字典中的wsgi.input文件,而读取该文件则首先需要获取文件的长度CONTENT_LENGTH;
- 将读取到请求数据,通过json解码成字典,再获取到对应key值,这里通过faker伪造数据模拟通过name查询数据库的过程;
- 最后将得到的信息组成字典,通过json编码成字符串,返回给前端;
- 这里没有对请求方式,请求路径,请求数据是否合法进行校验,单纯的测试POST请求流程;
总结
其实在上面的示例能感受到,其实一个Web应用,就是通过编写的WSGI处理函数去针对每个HTTP请求进行响应,但是后期随着你要处理
的URL越来越多,这个处理函数代码会越来越庞大,更加难以维护。所以在WSGI接口的基础上,将这些路由选择,请求方式判断等代码抽象,让Web框架去做,开发者只需要专注于业务逻辑代码,流行的Python Web框架Flask,Django就是这样。
Flask框架
这里简单看看Flask框架写一个Web App
备注:
- 这里处理对应两个URL,分别对应上述WSGI接口解析GET/POST请求;
- 这里面Flask框架通过使用装饰器,将URL和函数关联起来,这样的处理方式既简洁又方便,这样只用关注处理函数中代码逻辑即可;
- 后期可以分析Flask实现WSGI接口的源码,这里按下不表;
参考
WSGI规范(PEP3333)
wsgiref模块官方文档:
https://docs.python.org/zh-cn/3/library/wsgiref.html?highlight=wsgiref#module-wsgiref
WSGI教程:
边栏推荐
猜你喜欢
链表中的数字相加----链表专题
Pytorch深度学习快速入门教程 -- 土堆教程笔记(三)
Pytorch Deep Learning Quick Start Tutorial -- Mound Tutorial Notes (3)
ECCV 2022 Oral 视频实例分割新SOTA:SeqFormer&IDOL及CVPR 2022 视频实例分割竞赛冠军方案...
How to realize the short press and long press detection of the button?
营销建议 | 您有一份八月营销月历待查收! 建议收藏 !
交换机端口的三种类型详解与hybrid端口实验
Qiu Jun, CEO of Eggplant Technology: Focus on users and make products that users really need
C语言的高级用法
pytorch余弦退火学习率CosineAnnealingLR的使用
随机推荐
2022-08-01 Review the basic binary tree and operations
歌词整理
pytorch余弦退火学习率CosineAnnealingLR的使用
Custom filters and interceptors implement ThreadLocal thread closure
The difference between find, matches, lookingAt matching strings in matcher
Can MySQL use aggregate functions without GROUP BY?
交换机端口的三种类型详解与hybrid端口实验
IO stream articles -- based on io stream to realize folder copy (copy subfolders and files in subfolders) full of dry goods
无题二
Is there a problem with writing this?How to synchronize data in sql-client
无题六
Excuse me if you want to write data in mysql, with flink - connector - JDBC directly is ok, but I'm in the f
Tanabata romantic date without overtime, RPA robot helps you get the job done
tensorflow.keras cannot introduce layers
PAT Level B - B1021 Single Digit Statistics (15)
There is only one switch, how to realize the nqa of master-slave automatic switching
leetcode 剑指 Offer 10- I. 斐波那契数列
flink cdc支持从oracle dg库同步吗
js 图形操作一(兼容pc、移动端实现 draggable属性 拖放效果)
Creo 9.0 基准特征:基准轴