当前位置:网站首页>浅析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教程:
边栏推荐
- Wei Dongshan Digital Photo Frame Project Learning (6) Transplantation of tslib
- Imitation SBUS fixed with serial data conversion
- MySQL advanced (twenty-seven) database index principle
- 什么是CRM决策分析管理?
- 轩辕实验室丨欧盟EVITA项目预研 第一章(四)
- 长达四年的减肥记录
- 正则表达式replaceAll()方法具有什么功能呢?
- tensorflow.keras无法引入layers
- Qiu Jun, CEO of Eggplant Technology: Focus on users and make products that users really need
- 2022.8.3
猜你喜欢

Oracle temporary table space role

dotnet OpenXML parsing PPT charts Getting started with area charts

Seata source code analysis: initialization process of TM RM client

How to realize the short press and long press detection of the button?

Tanabata romantic date without overtime, RPA robot helps you get the job done

基于 Kubernetes 的微服务项目整体设计与实现

CCVR eases heterogeneous federated learning based on classifier calibration

Science bosses say | Hong Kong rhubarb KaiBin teacher take you unlock the relationship between the matrix and 6 g

Pytorch深度学习快速入门教程 -- 土堆教程笔记(三)

5. Deploy the web project to the cloud server
随机推荐
Can MySQL use aggregate functions without GROUP BY?
hcip BGP 增强实验
21 Days of Deep Learning - Convolutional Neural Networks (CNN): Clothing Image Classification (Day 3)
Qiu Jun, CEO of Eggplant Technology: Focus on users and make products that users really need
【零基础玩转BLDC系列】无刷直流电机无位置传感器三段式启动法详细介绍及代码分享
长达四年的减肥记录
CCVR eases heterogeneous federated learning based on classifier calibration
如何实现按键的短按、长按检测?
15.1.1、md—md的基础语法,快速的写文本备忘录
无题七
shell脚本实例
Seata source code analysis: initialization process of TM RM client
EU | Horizon 2020 ENSEMBLE: D2.13 SOTIF Safety Concept (Part 2)
leetcode 剑指 Offer 10- II. 青蛙跳台阶问题
C语言-数组
Creo 9.0 基准特征:基准点
express hot-reload
手把手教你纯c实现异常捕获try-catch组件
Pytorch Deep Learning Quick Start Tutorial -- Mound Tutorial Notes (3)
Going to book tickets tomorrow, ready to go home~~