WSGI直观形象的了解一下

1. 浏览器请求动态页面过程

2. WSGI

怎么在你刚建立的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。

3.定义WSGI接口

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

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

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

  • environ:一个包含所有HTTP请求信息的dict对象;
  • start_response:一个发送HTTP响应的函数。

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

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

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

4. web服务器-----WSGI协议---->web框架 传递的字典

{'HTTP_ACCEPT_LANGUAGE': 'zh-cn','wsgi.file_wrapper': <built-infunctionuwsgi_sendfile>,'HTTP_UPGRADE_INSECURE_REQUESTS': '1','uwsgi.version': b'2.0.15','REMOTE_ADDR': '172.16.7.1','wsgi.errors': <_io.TextIOWrappername=2mode='w'encoding='UTF-8'>,'wsgi.version': (1,0),'REMOTE_PORT': '40432','REQUEST_URI': '/','SERVER_PORT': '8000','wsgi.multithread': False,'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','HTTP_HOST': '172.16.7.152: 8000','wsgi.run_once': False,'wsgi.input': <uwsgi._Inputobjectat0x7f7faecdc9c0>,'SERVER_PROTOCOL': 'HTTP/1.1','REQUEST_METHOD': 'GET','HTTP_ACCEPT_ENCODING': 'gzip,deflate','HTTP_CONNECTION': 'keep-alive','uwsgi.node': b'ubuntu','HTTP_DNT': '1','UWSGI_ROUTER': 'http','SCRIPT_NAME': '','wsgi.multiprocess': False,'QUERY_STRING': '','PATH_INFO': '/index.html','wsgi.url_scheme': 'http','HTTP_USER_AGENT': 'Mozilla/5.0(Macintosh;IntelMacOSX10_12_5)AppleWebKit/603.2.4(KHTML,likeGecko)Version/10.1.1Safari/603.2.4','SERVER_NAME': 'ubuntu'
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装Hbase(分布式)遇到一些问题及解决方法

问题一&#xff1a;安装完成后在Hbase shell 命令行执行list命令时&#xff0c;爆出如下错误&#xff1a; hbase(main):001:0> list TABLE …

安装MySql卡在Start Service的问题

我的情况&#xff1a;之前在windows下安装过5.6版本&#xff0c;卸载后&#xff0c;现在安装5.7版本&#xff0c;然后卡在Start Service这里&#xff0c;log日志没报任何错误&#xff0c;后来经过不断的尝试各种网上的办法终于把问题解决了。 问题的原因就是当初卸载5.6版本时…

学习进度条11

第十三周 日期 星期一 星期二 星期三 星期四 星期五 星期六 所花时间&#xff08;包括上课&#xff09; 19:10-22:20 (编程河北省科技信息通用调查系统) 8:00-10:00 (上课) 18:30-21:00 (Oracle实验) 14:00-16:30 (编程河北省科技信息通用调查系统) 18:20-22:30 (编…

Python面向切面编程是什么

简而言之就是装饰器 https://blog.csdn.net/qq_41856814/article/details/90146293

hibernate实现多变联合查询

Hibernate主要支持两种查询方式&#xff1a;HQL查询和Criteria查询。前者应用较为广发&#xff0c;后者也只是调用封装好的接口。 现在有一个问题&#xff0c;就是实现多表连接查询&#xff0c;且查询结果集不与任何一个实体类对应&#xff0c;怎么解决呢&#xff1f; 举个例子…

PyCharm光标变粗的解决办法

pycharm中光标变粗&#xff0c;如下&#xff1a; 此时变成了改写模式&#xff0c;只需要按下键盘的insert键即可 转载于:https://www.cnblogs.com/uglyliu/p/6159839.html

SparkRDD常用算子实践(附运行效果图)

目录1、简单算子说明2、复杂算子说明 目录 SparkRDD算子分为两类&#xff1a;Transformation与Action. Transformation&#xff1a;即延迟加载数据&#xff0c;Transformation会记录元数据信息&#xff0c;当计算任务触发Action时&#xff0c;才会真正开始计算。 Action&am…

six库是什么

Utilities for writing code that runs on Python 2 and 3”“” 它是一个专门用来兼容 Python 2 和 Python 3 的库。它解决了诸如 urllib 的部分方法不兼容&#xff0c; str 和 bytes 类型不兼容等“知名”问题。

Kali-linux使用Nessus

Nessus号称是世界上最流行的漏洞扫描程序&#xff0c;全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务&#xff0c;并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件&#xff0c;Nessus可同时在本机或远端上遥控&#xff0c;进行系统的漏洞分析扫描…

HDFS读写数据的原理

目录1 概述2 HDFS写数据流程3 HDFS读数据流程 目录 最近由于要准备面试&#xff0c;就把之前学过的东西好好整理下&#xff0c;权当是复习。 下面说下HDFS读写数据的原理。 1 概述 HDFS集群分为两大角色&#xff1a;NameNode、DataNode NameNode负责管理整个文件系统的元数…

理解列存储索引

版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 优点和使用场景 SQL Server 内存中列存储索引通过使用基于列的数据存储和基于列的查询处理来存储和管理数据。 列存储索引适合于主要执行大容量加载和只读查询的数据仓库工作负荷…

Django项目部署到阿里云服务器上无法发送邮件STMP

部署好项目之后发送邮件无法发送&#xff0c;多方查阅之后&#xff0c;解决问题。 阿里云服务器禁用了25端口&#xff0c;导致无法发送邮件。 25端口申请开放的难度很大&#xff0c;直接放弃。 解决&#xff1a; 在 django项目的 settings.py文件中x修改port端口 。

美国诚实签经验——IMG全球医疗险,TODO

那么&#xff0c;诚实签最关键的4个要点 是什么呢&#xff1f; 第一&#xff0c;证明你有一定的经济实力。 可能需要房产、存款等证明&#xff0c;也需要银行信用卡或借记卡半年流水证明&#xff08;让人信服的每月进帐和消费能力&#xff09;。 这些是为了证明&#xff0c;你可…

大数据开发初学者学习路线

目录前言导读&#xff1a;第一章&#xff1a;初识Hadoop第二章&#xff1a;更高效的WordCount第三章&#xff1a;把别处的数据搞到Hadoop上第四章&#xff1a;把Hadoop上的数据搞到别处去第五章&#xff1a;快一点吧&#xff0c;我的SQL第六章&#xff1a;一夫多妻制第七章&…

Python的虚拟环境配置(pyenv+virtualenv)

一、为什么需要配置虚拟环境 Python 2和Python 3之间存在着较大的差异&#xff0c;并且&#xff0c;由于各种原因导致了Python 2和Python 3的长期共存。在实际工作过程中&#xff0c;我们可能会同时用到Python 2和Python 3&#xff0c;因此&#xff0c;也需要经常在Python 2和P…

安卓屏幕适配问题

屏幕适配是根据屏幕密度&#xff0c;dpi为单位的&#xff0c;而不是分辨率。 手机会根据不同手机的密度&#xff0c;自己去不同资源目录下去找对应的资源 比如:   每个图片目录下的图片资源都是一样的&#xff0c;只是大小不一样   比如drawable-sw800dp-mdpi目录&#xff…

MapReduce原理全剖析

MapReduce剖析图 如上图所示是MR的运行详细过程 首先mapTask读文件是通过InputFormat&#xff08;内部是调RecordReader()–&#xff1e;read()&#xff09;来一次读一行&#xff0c;返回K,V值。&#xff08;默认是TextInputFormat&#xff0c;还可以输入其他的类型如:音视频&…

利用selenium webdriver点击alert提示框

在进行元素定位时常常遇到这样的alert框&#xff1a; 那么该如何定位并点击确定或取消按钮呢&#xff1f;stackoverflow上找到了这个问题的答案。 OK&#xff0c; Show you the code&#xff1a; 1 driver.findElement(By.id("updateButton")).click(); 2 //pop up w…

Log 日志的使用与重要性

开发过程中出现bug是必不可免的&#xff0c;你会怎样debug&#xff1f;从第1行代码开始看么&#xff1f;还是有个文件里面记录着哪里错了更方便呢&#xff01;&#xff01;&#xff01;log日志 Python中有个logging模块可以完成相关信息的记录&#xff0c;在debug时用它往往事…

webdriver 的三种等待方式

1、显式等待 一个显式等待是你定义的一段代码&#xff0c;用于等待某个条件发生然后再继续执行后续代码。 from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWait #…