目錄
前言
WSGI
Bottle最簡應用
最後
首頁 後端開發 Python教學 Bottle原始碼閱讀筆記(一):WSGI

Bottle原始碼閱讀筆記(一):WSGI

Jun 23, 2017 pm 03:06 PM
bottle 原始碼 筆記 閱讀

前言

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1319
25
PHP教程
1269
29
C# 教程
1248
24
小紅書筆記怎麼刪除 小紅書筆記怎麼刪除 Mar 21, 2024 pm 08:12 PM

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

小紅書刪除的筆記能恢復嗎 小紅書刪除的筆記能恢復嗎 Oct 31, 2023 pm 05:36 PM

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

如何在最新的iOS 17系統中連接iPhone上的Apple Notes 如何在最新的iOS 17系統中連接iPhone上的Apple Notes Sep 22, 2023 pm 05:01 PM

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

小紅書發布過的筆記不見了怎麼辦?它剛發的筆記搜不到的原因是什麼? 小紅書發布過的筆記不見了怎麼辦?它剛發的筆記搜不到的原因是什麼? Mar 21, 2024 pm 09:30 PM

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

小紅書怎麼在筆記中加入商品連結 小紅書在筆記中加入商品連結教學 小紅書怎麼在筆記中加入商品連結 小紅書在筆記中加入商品連結教學 Mar 12, 2024 am 10:40 AM

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

Python在軟體原始碼保護的應用實踐 Python在軟體原始碼保護的應用實踐 Jun 29, 2023 am 11:20 AM

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

PHP程式碼在瀏覽器中如何顯示原始碼而不被解釋執行? PHP程式碼在瀏覽器中如何顯示原始碼而不被解釋執行? Mar 11, 2024 am 10:54 AM

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

如何在沉浸式閱讀器中使用Microsoft Reader Coach 如何在沉浸式閱讀器中使用Microsoft Reader Coach Mar 09, 2024 am 09:34 AM

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

See all articles