Bottle原始碼閱讀筆記(一):WSGI
前言
Bottle是一個Python Web框架。整個框架只有一個文件,不到4k行的程式碼,沒有Python標準函式庫以外的依賴,卻包含了路由、模板和插件等Web框架常用功能。透過閱讀Bottle原始碼來了解什麼是Web框架和Web框架是怎麼運作是再合適不過了。由於Bottle是支援WSGI的框架,在閱讀原始碼之前,我們先來了解什麼是WSGI。
注意:文中使用的Bottle版本為0.12.13。
WSGI
#一般的Web伺服器只能處理靜態頁面。如果涉及到動態內容,伺服器就需要與Java/Python/Ruby等伺服器語言進行交互,並將內容交給它們處理。由於大多數的Web伺服器都是用C寫,它們不能直接執行伺服器語言,所以兩者之間需要一座橋(在實際應用中,通常會在Web伺服器和WSGI應用程式中間添加一個應用伺服器來支援WSGI) 。而在Python中,WSGI就是這麼一座橋。 WSGI的實作分成兩個部分,一是伺服器,二是應用程式。下面就來看看它們各自是什麼樣子的,以及兩者之間是如何協作的。
1 class Server: 2 3 def __init__(self, server_address): 4 self.server_address = server_address 5 6 def set_app(self, application): 7 self.app = application 8 9 def serve_forever(self):10 while True:11 # socket.accept()12 if request_comein():13 self.handle_request()14 15 def handle_request(self):16 request_data = self.get_request()17 self.parse_request(request_data)18 environ = self.get_environ()19 result = self.application(environ, self.start_response)20 self.send_response(result)21 22 def start_response(self, status, headers, exc_info):23 pass24 25 def get_environ(self):26 pass27 28 def get_request(self):29 pass30 31 def parse_request(self, text):32 pass33 34 def send_response(self, message):35 pass36 37 38 def make_server(host, port, app, server=Server):39 server = server((host, port))40 server.set_app(app)41 return server42 43 def simple_app(environ, start_response):44 status = '200 OK'45 response_headers = [('Content-type', 'text/plain')]46 start_response(status, response_headers)47 return 'Hello World!'48 49 if __name__ == '__main__':50 server = make_server('localhost', 8080, simple_app)51 server.serve_forever()
限於篇幅,這個伺服器模型省略了很多細節,如果你想要一個簡單又能運行的WSGI伺服器,可以參考這裡Let's Build A Web Server.Part 2.。
伺服器在接收到請求後,對請求訊息的資訊進行解析,結果保存在一個名為environ的字典中。接著以environ與處理頭資訊的start_response函數作為參數,呼叫應用程式 application(environ, start_response) 。最後將應用的結果組成新的回應,發送回客戶端。
在應用程式方面,WSGI應用程式是一個可呼叫的物件。它可以是一個函數,方法,類,或是一個有__call__
方法的實例。上面的應用就是一個函數。
當各種伺服器和應用程式/框架都按照WSGI的標準進行開發時,我們可以根據需求自由地組合不同的伺服器和框架。
Bottle最簡應用
在簡單了解完WSGI後,我們回到Bottle,來觀察一個Bottle應用是什麼樣子的,如何運行,跟我們的模型有什麼差別。
1 from bottle import Bottle, run2 3 app = Bottle()4 5 @app.route('/hello')6 def hello():7 return 'Hello World!'8 9 run(app, host='localhost', port=8080, server='wsgiref')
現在執行這個程序,使用瀏覽器存取位址'localhost:8080/hello'就會看到'Hello World!'。
1. 與上面的應用程式不同,Bottle應用程式是一個實例。依照WSGI規定,Bottle物件要實作__call__方法:
1 def __call__(self, environ, start_response):2 ''' Each instance of :class:'Bottle' is a WSGI application. '''3 return self.wsgi(environ, start_response)
所以這個Bottle.wsgi方法就是伺服器呼叫Bottle應用程式的入口,同時也是我們閱讀源碼的入口。
2. @app.route()這個裝飾器將一個函數綁定到一個URL。當我們造訪'localhost:8080/hello'時,hello函數就會被呼叫。
3. Bottle預設的伺服器是wsgiref(Python標準庫裡的一個WSGI簡單實作)。當然Bottle也為許多伺服器編寫了適配器(Adapter),只需要改變server的值,run()函數會根據伺服器的名稱尋找對應的適配器。無需編寫額外的程式碼。
run函數和適配器部分程式碼:
1 def run(app=None, server='wsgiref', host='127.0.0.1', port=8080, 2 interval=1, reloader=False, quiet=False, plugins=None, 3 debug=None, **kargs): 4 if server in server_names: 5 server = server_names.get(server) 6 if isinstance(server, basestring): 7 server = load(server) 8 if isinstance(server, type): 9 server = server(host=host, port=port, **kargs)10 if not isinstance(server, ServerAdapter):11 raise ValueError("Unknown or unsupported server: %r" % server)12 ...13 server.run(app)14 15 class MeinheldServer(ServerAdapter):16 def run(self, handler):17 from meinheld import server18 server.listen((self.host, self.port))19 server.run(handler)
最後
在本文中,我們簡單介紹了在WSGI標準下伺服器和應用程式如何進行互動。下一篇,我們繼續圍繞這個最簡應用,講講與@app.route()有關的路由功能。
以上是Bottle原始碼閱讀筆記(一):WSGI的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

小紅書筆記怎麼刪除?在小紅書APP中是可以編輯筆記的,多數的用戶不知道小紅書筆記如何的刪除,接下來就是小編為用戶帶來的小紅書筆記刪除方法圖文教程,有興趣的用戶快來一起看看吧!小紅書使用教學小紅書筆記怎麼刪除1、先打開小紅書APP進入到主頁面,選擇右下角【我】進入到專區;2、之後在我的專區,點擊下圖所示的筆記頁面,選擇要刪除的筆記;3、進入到筆記頁面,右上角【三個點】;4、最後下方會展開功能欄,點選【刪除】即可完成。

小紅書刪除的筆記不能恢復。小紅書作為知識分享和購物平台,為使用者提供了記錄筆記和收藏有用資訊的功能。根據小紅書的官方說明,已經刪除的筆記是無法恢復的。小紅書平台並沒有提供專門的筆記恢復功能。這意味著,一旦在小紅書中刪除了筆記,無論是不小心誤刪還是其他原因,一般情況下是無法從平台上找回被刪除的內容的。如果遇到特殊情況,可以嘗試聯絡小紅書的客服團隊,看是否能夠協助解決問題。

使用新增連結功能在iPhone上連結AppleNotes。筆記:如果您已安裝iOS17,則只能在iPhone上的AppleNotes之間建立連結。在iPhone上開啟「備忘錄」應用程式。現在,打開要在其中添加連結的註釋。您也可以選擇建立新備忘錄。點擊螢幕上的任何位置。這將向您顯示一個選單。點擊右側的箭頭以查看“新增連結”選項。點擊它。現在,您可以鍵入註解的名稱或網頁URL。然後,點擊右上角的完成,新增的連結將出現在筆記中。如果要添加指向某個單字的鏈接,只需雙擊該單字即可將其選中,選擇“添加鏈接”並按

作為一名小紅書的用戶,我們都曾經遇到過發布過的筆記突然不見了的情況,這無疑讓人感到困惑和擔憂。在這種情況下,我們該怎麼辦呢?本文將圍繞著「小紅書發布過的筆記不見了怎麼辦」這個主題,為你詳細解答。一、小紅書發布過的筆記不見了怎麼辦?首先,不要驚慌。如果你發現筆記不見了,保持冷靜是關鍵,不要慌張。這可能是由於平台系統故障或操作失誤引起的。檢查發布記錄很簡單。只要打開小紅書App,點擊“我”→“發布”→“所有發布”,就可以查看自己的發布記錄。在這裡,你可以輕鬆找到之前發布的筆記。 3.重新發布。如果找到了之

小紅書怎麼在筆記中添加商品連結?在小紅書這款app中用戶不僅可以瀏覽各種內容還可以進行購物,所以這款app中關於購物推薦、好物分享的內容是非常多的,如果小夥伴在這款app也是一個達人的話,也可以分享一些購物經驗,找到商家進行合作,在筆記中添加連結之類的,很多人都願意使用這款app購物,因為不僅方便,而且有很多達人會進行一些推薦,可以一邊瀏覽有趣內容,一邊看看有沒有適合自己的衣服商品。一起看看如何在筆記中添加商品連結吧!小紅書筆記添加商品連結方法 在手機桌面上開啟app。 在app首頁點擊

Python是一種高階程式語言,具有簡單易學、易讀易寫等特點,在軟體開發領域中得到了廣泛的應用。然而,由於Python的開源特性,原始碼很容易被他人輕易獲取,這就為軟體原始碼保護帶來了一些挑戰。因此,在實際應用中,我們常常需要採取一些方法來保護Python原始碼,確保其安全性。在軟體原始碼保護中,有多種針對Python的應用實務可供選擇。以下將介紹幾種常見

PHP程式碼在瀏覽器中如何顯示原始碼而不被解釋執行? PHP是一種伺服器端腳本語言,通常用於開發動態網頁。當PHP檔案在伺服器上被要求時,伺服器會解釋執行其中的PHP程式碼,並將最終的HTML內容傳送到瀏覽器以供顯示。然而,有時我們希望在瀏覽器中直接展示PHP檔案的原始碼,而不是被執行。本文將介紹如何在瀏覽器中顯示PHP程式碼的源碼,而不被解釋執行。在PHP中,可以使

在這篇文章中,我們將向你展示如何在WindowsPC上的沉浸式閱讀器中使用Microsoft閱讀教練。閱讀指導功能幫助學生或個人練習閱讀並培養他們的識字技能。你從閱讀支援的應用程式中的一段或一份文件開始,基於此,你的閱讀報告由閱讀教練工具產生。閱讀報告顯示了閱讀的準確性、閱讀所花費的時間、每分鐘的正確單字數,以及你在閱讀時發現最具挑戰性的單字。你還將能夠練習這些單詞,這總體上有助於培養你的閱讀技能。目前,僅有Office或Microsoft365(包括OneNoteforWeb和WordforWe
