首页 > 编程语言 >python中的wsgi是什么?

python中的wsgi是什么?

时间:2023-04-30 12:00:30浏览次数:55  
标签:web wsgi HTTP 请求 Web python 什么 WSGI 服务器

1.简单介绍

  wsgi是需要安装的。

  官方定义:wsgi是Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。

  大白话:wsgi就是一种规范,提供了一种标准,一种sever与application之间的一种标准,它定义了使用web应用程序与Python编写的web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。

 

  几个关于WSGI相关的概念

  WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范。server和application的规范在PEP 3333中有具体描述。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Torando,Flask,Django。(Torando使用后无法使用异步,另一篇文章会讲解)

  uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。

  uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。uWSGI 服务器可以作为一个独立的应用服务器,也可以与其他 Web 服务器(如 Nginx、Apache)一起使用,通过 WSGI 协议与 Python 应用程序通信。

 

2.WSGI引入

2.1 浏览器请求动态页面过程

 

2.2 问题

  怎么在你刚建立的Web服务器上运行一个Django应用和Flask应用,如何不做任何改变而适应不同的web架构呢

  在以前,选择 Python web 架构会受制于可用的web服务器,反之亦然。如果架构和服务器可以协同工作,那就好了:

 

 

  但有可能面对(或者曾有过)下面的问题,当要把一个服务器和一个架构结合起来时,却发现他们不是被设计成协同工作的:

  

 

 

  那么,怎么可以不修改服务器和架构代码而确保可以在多个架构下运行web服务器呢?答案就是 Python Web Server Gateway Interface (或简称 WSGI,读作“wizgy”)

  

 

 

  WSGI允许开发者将选择web框架和web服务器分开。可以混合匹配web服务器和web框架,选择一个适合的配对。比如,可以在Gunicorn 或者 Nginx/uWSGI 或者 Waitress上运行 Django, Flask, 或 Pyramid。真正的混合匹配,得益于WSGI同时支持服务器和架构:

  

 

 

  web服务器必须具备WSGI接口,所有的现代Python Web框架都已具备WSGI接口,它让你不对代码作修改就能使服务器和特点的web框架协同工作。

  WSGI由web服务器支持,而web框架允许你选择适合自己的配对,但它同样对于服务器和框架开发者提供便利使他们可以专注于自己偏爱的领域和专长而不至于相互牵制。其他语言也有类似接口:java有Servlet API,Ruby 有 Rack。

  所以到这里,其实就是一个问题?为什么需要WSGI?

  首先,我们明确一下web应用处理请求的具体流程:

  1. 用户操作操作浏览器发送请求;
  2. 请求转发至对应的web服务器
  3. web服务器将请求转交给web应用程序,web应用程序处理请求
  4. web应用将请求结果返回给web服务器,由web服务器返回用户响应结果
  5. 浏览器收到响应,向用户展示

  可以看到,请求时Web服务器需要和web应用程序进行通信,但是web服务器有很多种啊,Python web应用开发框架也对应多种啊,所以WSGI应运而生,定义了一套通信标准。试想一下,如果不统一标准的话,就会存在Web框架和Web服务器数据无法匹配的情况,那么开发就会受到限制,这显然不合理的。

  既然定义了标准,那么WSGI的标准或规范是?

  web服务器在将请求转交给web应用程序之前,需要先将http报文转换为WSGI规定的格式。

  WSGI规定,Web程序必须有一个可调用对象,且该可调用对象接收两个参数,返回一个可迭代对象:

  1. environ:字典,包含请求的所有信息
  2. start_response:在可调用对象中调用的函数,用来发起响应,参数包括状态码,headers等

  下面来更加详细的讲解一下什么是WSGI?

 

3.什么是WSGI

  (1)、RESTful只是设计风格而不是标准,而WSGI(Web Server Gateway Interface,Web服务器网关接口)则是Python语言中所定义的Web服务器和Web应用程序之间或框架之间的通用接口标准。

  (2)、WSGI就是一座桥梁,桥梁的一端称为服务端或网关端,另一端称为应用端或者框架端,WSGI的作用就是在协议之间进行转化。WSGI将Web组件分成了三类:Web 服务器(WSGI Server)、Web中间件(WSGI Middleware)与Web应用程序(WSGI Application)。

  (3)、Web Server接收HTTP请求,封装一系列环境变量,按照WSGI接口标准调用注册的WSGI Application,最后将响应返回给客户端。

  (4)、Web应用的本质:

1)、浏览器发送HTTP请求

2)、服务器接收到请求,生成HTML文档

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

4)、浏览器收到HTTP响应,从HTTP Body取出HTML文档进行显示

  接受HTTP请求、解析HTTP请求、发送HTTP响应都是重复的苦力活,如果我们自己来写这些底层代码,还没开始写HTML,先要花半把个月研读HTTP规范。所以底层的代码应该由专门的服务器软件实现,我们用python专注于生成HTML文档。

  因为我们不想要接触TCP连接、HTTP原始请求和响应格式。所以需要一个统一的接口,专心用python编写Web业务。

 

4.WSGI的接口

  1.WSGI接口定义格式

  WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求。我们来看一个最简单的Web版本的“Hello World!”:

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

 

  2.参数解释

  上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:

  • environ:一个包含所有HTTP请求信息的dict对象;在用户向服务器请求数据时获得
  • start_response:一个发送HTTP响应的函数,就是一个回调函数,用来生成服务器对浏览器的响应头部。

 

  3.回调函数start_response解析

  在application()函数中,调用:

start_response('200 OK', [('Content-Type', 'text/html')])

  start_response()函数接收两个参数:

  • 一个是HTTP响应码
  • 一个是一组元组列表list表示的HTTP Header,每个Header用一个包含两个str的tuple表示。

  start_response的作用是限制响应Body的内容形式以及提供响应的状态码信息===》Header,所以这个回调函数的作用就是发送HTTP响应的Header

  注意Header只能发送一次,也就是只能调用一次start_response()。

  然后,把函数的返回值作为HTTP响应的Body发送给浏览器。

 

  4.WSGI的作用

  整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,把底层web服务器解析部分和应用程序逻辑部分进行了分离,这样开发者就可以专心做一个领域了

  不过,等等,这个application()函数怎么调用?如果我们自己调用,两个参数environ和start_response我们没法提供,返回的str也没法发给浏览器。

  所以application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器。而我们此时的web服务器项目的目的就是做一个既能解析静态网页还可以解析动态网页的服务器

 

5.一个课堂上完整的例子

  老师说wsgi的原理本质上就是socket,wsgi帮我们做了很多事情,比如一些数据处理等,然后在把数据交给web框架,而只有tornado没有wsgi,其余的框架基本都有,但是只有tornado有异步处理。

  接下来,用一个简单的代码一步一步来剖析一下这个web框架的底层原理。

  首先下面的代码,就是利用wsgi来写一个web框架。

 

 

  接下来

  

 

 

  继续

  

 

 

  结果,本质上就是socket

  

 

 

  搞清楚wsgi后,看看所有的代码的作用

  

 

 

  使用web界面访问,就会返回以下

  

 

 

  但是这样只是固定的永远返回的相同的字符,这样肯定不行,所以,需要根据用户输入的url来判断,然后进行返回不一样的内容。

  

 

 

 

6.使用WSGI实现一个mini_frame(web框架)

 

7.总结

  wsgi就是一种规范,它定义了使用web应用程序与Python编写的web服务器程序之间的接口格式.无论多么复杂的Web应用程序,入口都是一个WSGI处理函数。HTTP请求的所有输入信息都可以通过environ获得,HTTP响应的输出都可以通过start_response()加上函数返回值作为Body。

  Flask中的werkzeug工作原理类似.

 

8.参考

参考:

https://wolfmua.blog.csdn.net/article/details/106195774

https://zhuanlan.zhihu.com/p/95942024

https://blog.csdn.net/qq_40333984/article/details/125777176

https://zhuanlan.zhihu.com/p/95942024

标签:web,wsgi,HTTP,请求,Web,python,什么,WSGI,服务器
From: https://www.cnblogs.com/lizexiong/p/17365096.html

相关文章

  • PYTHON 微博单独网址
    fromseleniumimportwebdriverfromselenium.webdriverimportActionChainsfromselenium.webdriver.common.byimportBy#按照什么方式查找,By.ID,By.CSS_SELECTORfromselenium.webdriver.common.keysimportKeys#键盘按键操作fromselenium.webdriver.supportimport......
  • <Python数据处理> Jacqueline Kazil Katharine Jarmul
    附录:数据分析师:AllenDowney的《统计思维:程序员数学之概率统计(第2版)》很好地介绍了统计数学概念并且使用了Python。CathyO'Neill和RachelSchutt的《数据科学实战》提供了数据科学领域的深入分析。scipy技术栈WesMcKinney编写了《利用Python进行数据分析》......
  • Think Python-How to Think Like a Computer Scientist_chapter4_练习 4-3
    #coding=gbkimportmathimportturtlebob=turtle.Turtle()print(bob)defpie(t,r,n):"""画一个包含n个三角形的饼图。t:Turtleobjectr:三角形腰长n:包含几个三角形或几边形"""angle1=180/nangle2=90+angle1y=......
  • python脚本 --- 去除txt的指定行数
    #-*-coding:UTF8-*-foriinrange(17,800):filename=i+1;withopen('.\\'+str(filename),"r")asf:#读取文本data=f.readlines()f.close()#那么现在data=[0,1,2,3,4,5,6,7,8,9,10]dirtyid=[0,1,2,3,4,5......
  • python-全双工,双工,单工的区别
    全双工(FullDuplex):通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时进行信号的双向传输半双工(HalfDuplex):数据可以在一个信号载体的两个方向上传输,但是不能同时传输。像全双工传输一样,半双工包含一个双向线路,两线制。单工:只允许甲......
  • Python+UDP+Threading
    Python+UDP+Threading近期用pythonsocket使用TCP协议做了一个小型的数据收发服务器,后来由于在实际场景中使用时,出现网络不佳导致出现错误的情况,改成了使用UDP协议重做了一版,总体效果变好了。下面是通用代码,实际使用时在这基础上进行修改即可。#-*-coding:utf-8-*-import......
  • 【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介模板方法模式(TemplateMethodPattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法,从而对剩余的逻辑有......
  • Python打印一个字典,输出带双引号
    Python中dict(字典)默认的表示方式是用单引号表示键和值,例如:my_dict={'key1':'value1','key2':'value2'}print(my_dict)这将输出:{'key1':'value1','key2':'value2'}如果你想使用双引号代替单引号进行表示,可以使用json模块来实现。......
  • Python MatplotlibDeprecationWarning Matplotlib 3.6 and will be removed two minor
    百度飞桨(PaddlePaddle)-数字识别在Pycharm中使用Matplotlib中的pyplot时,运行代码报错:MatplotlibDeprecationWarning:SupportforFigureCanvaseswithoutarequired_interactive_frameworkattributewasdeprecatedinMatplotlib3.6andwillberemovedtwominorreleases......
  • Python: PostgreSQL
     connectionimportpsycopg2frompsycopg2importError,connection,cursorconn:connection|None=Nonec1:cursor|None=Nonetry:conn=psycopg2.connect(host='localhost',port=5432,user='postgres',......