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.pswp.cn/news/456738.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456738.shtml
英文地址,請注明出處:http://en.pswp.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 #…