搜尋
首頁後端開發Python教學ASGI解釋:Python Web開發的未來

譯者| 李睿

審校| 孫淑娟

#Python Web應用程式長期以來一直遵循Web伺服器網關介面(WSGI)標準,該標準描述了它們如何與Web伺服器通訊。 WSGI最初於2003年推出,並於2010年更新,僅依賴Python2.2版本中原生可用的、易於實現的功能。因此, WSGI迅速融入了所有主要的Python Web框架,並成為Python Web開發的基石。

快轉到2022年。 Python2已經過時,Python現在具有處理網路呼叫等非同步操作的原生語法。 WSGI和其他預設假定同步行為的標準無法利用非同步的效能和效率增益。這反過來又意味著WSGI不能有效地處理像WebSocket這樣的高階協定。

輸入ASGI,即非同步伺服器閘道介面。與WSGI類似,ASGI描述了Python Web應用程式和Web伺服器之間的通用介面。與WSGI不同的是,ASGI允許每個應用程式有多個非同步事件。另外,ASGI支援同步和非同步應用程式。開發人員可以將原有的同步WSGI Web應用程式遷移到ASGI,也可以使用ASGI建立新的非同步Web應用程式。

1.WSGI的工作原理

WSGI的工作原理是向Web伺服器公開Python函數,通常命名為應用程式或app。此函數採用兩個參數:

  • environ:包含有關目前請求和Web伺服器提供的環境變數的資訊的字典。
  • start_response:將用於啟動將HTTP回應傳送回客戶端的函式。

函數傳回的資料構成回應體。

一個簡單的應用程式函數可能如下所示:

def application(environ, start_response):

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

 return [b'Greetings universe']

如果使用的是與WSGI相容的Web框架(例如Flask ),那麼框架本身將提供一個應用程式功能,其所有元件將自動連接。

WSGI有兩個缺點:首先,WSGI一次只處理一個請求和回應,並假設回應將立即傳回。沒有辦法處理長時間保持的連接,例如WebSocket或長輪詢HTTP連接。

其次,WSGI只是同步的。即使使用多執行緒連接池,每個連線都會阻塞,直到它回傳回應。許多WSGI設定都能夠處理執行緒池和進程池,但這些都受到WSGI介面本身同步的限制。

2.ASGI的工作原理

ASGI在外觀上與WSGI相似。與WSGI一樣,開發人員可以定義一個應用程式函數對象,但它是一個帶有三個參數而不是兩個參數的非同步函數:

scope:包含有關當前請求的資訊的字典,類似WSGI中的environ,但細節的命名約定略有不同。

send:允許應用程式將訊息傳回客戶端的非同步可呼叫函數。

receive:允許應用程式從客戶端接收訊息的非同步可呼叫函數。

一個簡單的ASGI應用程式函數如下所示:

async def application(scope, receive, send):
 await send({
 'type': 'http.response.start',
 'status': 200,
 'headers': [
 [b'content-type', b'text/plain'],
 ],
 })
 await send({
 'type': 'http.response.body',
 'body': b'Hello, world!',
 })

與WSGI Web框架一樣,ASGI Web框架會產生自己的application ()函數,並根據需要將其連接起來。

與ASGI最明顯的差異是,在整個函數中使用了非同步隱喻。函數本身是異步的,在此透過兩個單獨的await send( )命令發送HTTP標頭和回應正文。這樣,函數本身及其發送命令就不會阻塞任何內容;它們可以與應用程式的呼叫交織在一起,並可以同時從許多其他連接中發送。

在這個範例中沒有使用receive,但它也是一個非同步函數。它讓在不阻塞其他操作的情況下接收請求正文。請求和回應可以以這種方式增量地傳入或傳出伺服器——這是無法很好地完成的事情,或者可能根本無法使用WSGI完成的。

3.在ASGI中使用同步和非同步函數

使用ASGI時,需要盡可能使用非同步函數和非同步友善程式庫。養成使用非同步的習慣是值得的,因為使用僅同步程式碼的問題可能很嚴重。任何對同步函數的長時間呼叫都會阻塞整個呼叫鏈,使使用非同步的好處幾乎消失殆盡。

如果在使用長時間運行的同步呼叫時遇到問題,則需要使用asyncio.run_in_executor將呼叫外包給執行緒池或進程池。每當等待外部事件或非CPU密集型任務時,都應使用執行緒池。而進程池應該用於CPU密集的本地任務。

例如,Web應用程式中有一個路由可以呼叫遠端網站,那麼應該使用執行緒。或者更好的方法是,使用發出非同步HTTP請求的aiohttp函式庫。如果想要呼叫Pillow映像庫來調整映像大小,可能應該使用具有進程池的run_in_executor。儘管在進程之間來回傳輸資料會有一些輕微的開銷,但使用run_in_executor不會阻塞其他事件。

#

4.支持ASGI的Web框架

通过实现application( )对象,可以人工编写ASGI Web应用程序。但绝大多数情况下,使用异步原生、以ASGI为中心的Python Web框架会更简单。以下是一些常见的与ASGI兼容的Web框架:

Starlette和FastAPI:这些新兴框架(FastAPI构建在Starlette之上)都是异步优先的,因此它们都支持ASGI也就不足为奇了。如果是从零开始开发Web应用程序,那么它们是Python最现代和最前沿的Web框架。

Quart:虽然主要的Python Web框架Flask确实支持ASGI,但Flask的设计并不是从内到外利用异步隐喻。来自GitLab的Quart使用Flask的语法和隐喻,但允许异步路由处理程序。

Django 3.0及更高版本:从Django3.0开始,久负盛名的Django Web框架支持ASGI。在Django 3.1中添加了对Django应用程序中异步代码的支持,而不是仅仅能够在ASGI处理程序上挂载Django。对于一个不以执行速度著称的框架来说,异步的存在为那些选择利用它的人带来了更好的性能。

原文链接:https://www.infoworld.com/article/3658336/asgi-explained-the-future-of-python-Web-development.html​

以上是ASGI解釋:Python Web開發的未來的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:51CTO.COM。如有侵權,請聯絡admin@php.cn刪除
详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),