当前位置:网站首页>浅析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教程:
边栏推荐
- leetcode 剑指 Offer 10- II. 青蛙跳台阶问题
- hcip BGP enhancement experiment
- Dry goods!Generative Model Evaluation and Diagnosis
- MySQL使用聚合函数可以不搭配GROUP BY分组吗?
- dotnet OpenXML 解析 PPT 图表 面积图入门
- 2022/8/4 考试总结
- Science bosses say | Hong Kong rhubarb KaiBin teacher take you unlock the relationship between the matrix and 6 g
- leetcode: 529. Minesweeper Game
- Overall design and implementation of Kubernetes-based microservice project
- 19.服务器端会话技术Session
猜你喜欢
eKuiper Newsletter 2022-07|v1.6.0:Flow 编排 + 更好用的 SQL,轻松表达业务逻辑
egg框架使用(一)
营销建议 | 您有一份八月营销月历待查收! 建议收藏 !
There is only one switch, how to realize the nqa of master-slave automatic switching
Oracle临时表空间作用
shell脚本实例
Pytorch深度学习快速入门教程 -- 土堆教程笔记(三)
基于 Kubernetes 的微服务项目整体设计与实现
leetcode: 529. Minesweeper Game
Oracle temporary table space role
随机推荐
Open Source Summer | How OpenHarmony Query Device Type (eTS)
egg框架使用(一)
mysql进阶(二十七)数据库索引原理
Neuron Newsletter 2022-07|新增非 A11 驱动、即将支持 OPC DA
请问大佬们 ,使用 Flink SQL CDC 是不是做不到两个数据库的实时同步啊
Wei Dongshan Digital Photo Frame Project Learning (6) Transplantation of tslib
HStreamDB Newsletter 2022-07|分区模型优化、数据集成框架进一步完善
There is only one switch, how to realize the nqa of master-slave automatic switching
C语言的高级用法
我的杂记链接
21 Days of Deep Learning - Convolutional Neural Networks (CNN): Clothing Image Classification (Day 3)
科普大佬说 | 港大黄凯斌老师带你解锁黑客帝国与6G的关系
Analysis and practice of antjian webshell dynamic encrypted connection
无题四
无题五
seata源码解析:TM RM 客户端的初始化过程
The Seven Weapons of Programmers
IDEA执行Test操作导致数据插入时出现了重复数据
sql server中 两表查询 平均数 分组
ECCV 2022 Oral 视频实例分割新SOTA:SeqFormer&IDOL及CVPR 2022 视频实例分割竞赛冠军方案...