《Flask Web開發》 第二章 應用的基本結構

2021-09-24 09:21:11 字數 3991 閱讀 4391

所有flask應用都必須建立乙個應用例項

web伺服器使用一種名為web伺服器閘道器介面(wsgi, web server gateway inte***ce,讀作「wiz-ghee」)的協議,把接收自客戶端的所有請求都轉交給這個物件處理。

應用例項是flask類的物件,由下面**建立

from flask import flask
flask類的建構函式只有乙個必須指定的引數,即應用主模組或者包的名稱。大多數情況下,python的__name__變數就是所需的值。flask使用__name__來確定應用的位置,進而找到應用中其他檔案的位置,如影象和模板

客戶端(例如web瀏覽器)把請求傳送給web伺服器,web伺服器再把請求傳送給flask應用例項。應用例項需要知道對每個url的請求執行那些**,所以儲存了url到python函式的對映關係。處理url和函式之間關係的程式被稱為路由

def index(): # 把index()函式註冊為應用根位址的處理程式

return ''

def index(): # 將index函式註冊為應用根位址的處理程式

return''

index()這樣處理入站請求的函式稱為檢視函式。如果應用部署在網域名稱為www.bilibili.com的 伺服器上,在瀏覽器中訪問 後,會觸發伺服器執行index()函式。這個函式的返回值稱為響應,是客戶端收到的內容。如果客戶端是web瀏覽器,響應就是顯示給使用者檢視的文件。檢視函式返回的響應可以是包含html的簡單字串。

def user(name):

return ''.format(name) # 路由url在{}的內容就是動態部分

呼叫檢視函式時,flask會將動態部分作為引數傳入引數。name引數用於生成個性化的歡迎資訊。

路由中的動態部分預設是字串,也可為其他。如路由/user/int:id只會匹配動態片段id為整數的url,如/user/123。flask支援路由中使用string, int, float和path型別(path為一種特殊的字串,特殊之處在於可以包含正斜線)

裝飾器是python語言的標準特性。慣常用法是把函式註冊為時間處理程式,在特定事件發生時使用

flask提供的web伺服器只適用於開發和測試。

新增乙個動態路由。在瀏覽器中訪問中國動態url,會看到一條個性化的資訊

hello.py: 包含動態路由的flask應用

from flask import flask

def index():

return ''

def user(name):

return ''.format(name)

flask應用可以在除錯模式中執行,在此模式下,開發伺服器缺省會載入兩個工具:過載器和偵錯程式。

啟用過載器後,flask會監視專案中的所有原始碼檔案,發現變動時自動重啟伺服器。在開發過程中執行啟動過載器的伺服器特別方便,因為每次修改並且儲存原始碼檔案以後,伺服器都會自動重啟,讓改動生效

偵錯程式是乙個基於web的工具,當應用丟擲未處理的異常時,它會出現在瀏覽器中。此時,web瀏覽器變成乙個互動式棧跟蹤,可以在裡面審查原始碼,在呼叫棧的任何位置計算表示式

除錯模式預設禁用,在執行flask run之前設定flask_debug=1可以啟用偵錯程式

flask --help或者flask可以檢視那些選項可以使用

flask shell在應用上下文開啟乙個python shell會話,在會話中可以執行維護任務或者測試,也可以除錯問題

flask run在web開發伺服器中執行應用

flask run --host告訴伺服器在那個網路介面上監聽客戶端發來的連線

flask的web伺服器在監聽localhost上的連線,因此伺服器只接受執行伺服器的計算機傳送的連線

flask run --host 0.0.0.0讓web伺服器監聽公共網路介面上的連線

flask從客戶端收到請求時,要讓檢視函式能訪問一些物件,才能處理請求。請求物件封裝了客戶端傳送的http請求

為了避免大量引數把檢視函式搞得一團糟,flask使用上下文臨時把某些物件變為全域性可訪問。有上下文可以這樣編寫檢視函式:

from flask import flask

def index():

user_agent = request.headers.get('user-agent')

return 'your browser is {}

'.format(user_agent)

請求上下文被推送後,就可以使用request和session變數。如果變數未啟用應用上下文或請求上下文,就會錯誤。執行

輸出

traceback (most recent call last):

...

–執行

輸出

'hello'
–執行

map([index>,

' (options, get, head) -> static>,

' (options, get, head) -> user>])

url對映中的(head,options,get)是請求方法,由路由進行處理

flask為每個路由都指定了請求方法,所以即使不同的請求方法傳送到相同的url上時,也會使用不同的檢視函式處理。head和options由flask處理。

可以這樣說,在此應用中,url對映中的3個路由都使用get方法(表示客戶端想請求乙個如網頁的訊息)

flask通過上下文變數request對外開放請求物件,此物件包含客戶端傳送的http請求的全部資訊。

為了避免在每個檢視函式中都重複編寫**,flask提供了註冊通用函式功能,註冊的函式可以在請求被分配到檢視函式之前或之後呼叫。

請求鉤子通過裝飾器實現。

flask支援以下四種鉤子:

在請求鉤子函式和檢視函式之間共享資料一般使用上下文全域性變數g

flask呼叫檢視函式後,會將其返回值作為響應的內容。多數情況下,響應就是乙個簡單的字串,作為html頁面回送客戶端。

但是http協議需要的不僅僅是請求響應的字串,http中很重要的是狀態碼,flask預設為200,表明請求已被成功處理

如果檢視函式返回的響應需要使用不同的狀態碼,可以把數字**作為第二個返回值,新增到響應文字之後。

make_response()可以接受1、2、或3個引數(和檢視函式的返回值一樣),然後返回乙個等效的響應物件。有時需要在檢視函式中生成響應物件,然後在響應物件上呼叫各個方法,進一步設定響應

重定向響應沒有頁面文件,只會告訴瀏覽器乙個新的url,用以載入新頁面。

重定向的狀態碼通常是302,在location首部中提供目標url,重定向響應可以使用3個值形式的返回值生成,也可以在響應物件中設定。

flask提供的redirect()函式可以生成重定向響應:

from flask import redirect

def index():

return redirect('')

abort()函式用於處理錯誤

from flask import abort

def get_user(id):

user = load_user(id)

if not user:

abort(404) # 若url中動態引數id對應的使用者不存在,則返回狀態碼404,abort()不會把控制權交給呼叫函式,而是丟擲異常

return ''.format(user.name)

第二章 網路應用

第二章 網路應用 1.網路應用體系結構 識記網路應用特性結構與分類 客戶 伺服器 c s 結構 純p2p結構 混合結構 領會c s網路應用 p2p網路應用以及混合網路應用的特點 區別與聯絡 c s最主要的特徵是通訊只在客戶與伺服器之間進行,客戶與客戶之間不進行直接通訊 p2p結構可以動態地直接與其他...

第二章 應用層

一 網路應用程式體系結構 1 客戶機 伺服器體系結構 2 p2p體系結構 其實在這種體系結構中也有客戶機和伺服器,只是每個主機既充當了客戶機,又充當了伺服器的角色。發起主動連線的是客戶機,被動連線的是伺服器。二 套接字 程序是通過稱為套接字的軟體介面在網路上傳送和接受資料。打個比方 程序是一座房子,...

第二章 的應用方式

第二章 的應用方式 動態網製作指南 knowsky.的 聲 明 方 式 這章節將開始為您介紹 的應用。當然一開始要介紹的是如何去建立個樣式表 style sheets 包括了宣告的方式和應用在網頁上的方法,最後還會為您概述一下 的一些特性。概略來說,的宣告有三種方式 一 基本宣告 最典型的 宣告方式...