JSON 是HTTP 請(qǐng)求和響應(yīng)使用的傳輸格式。在資源的內(nèi)部表示和JSON 之間進(jìn)行轉(zhuǎn)換。
GET 請(qǐng)求實(shí)現(xiàn)用于處理不同資源的路由,只返回信息,無需修改信息。
路由:
處理URL 和函數(shù)之間關(guān)系的程序稱為路由。處理URL 到Python 函數(shù)的映射關(guān)系
Flask定義路由:
使用程序?qū)嵗峁┑?b>app.route 修飾器,把修飾的函數(shù)注冊(cè)為路由。

修飾器是Python 語言的標(biāo)準(zhǔn)特性,使用不同的方式修改函數(shù)的行為,使用修飾器把函數(shù)注冊(cè)為事件的處理程序。
index( )函數(shù)稱為視圖函數(shù),視圖函數(shù)返回的響應(yīng),可以使包含HTML 的簡(jiǎn)單字符串,也可以是復(fù)雜的表單。
URL 格式地址中都包含可變部分,F(xiàn)lask 支持這種形式的URL,只需在route 修飾器中使用特
殊的句法即可。

調(diào)用視圖函數(shù)時(shí),F(xiàn)lask 會(huì)將動(dòng)態(tài)部分作為參數(shù)傳入函數(shù)。
路由中的動(dòng)態(tài)部分默認(rèn)使用字符串,不過也可使用類型定義。
Flask 支持在路由中使用int、float 和path 類型。
path 類型也是字符串,但不把斜線視作分隔符,而將其當(dāng)作動(dòng)態(tài)片段的一部分。
程序?qū)嵗?b>run 方法啟動(dòng)Flask 集成的開發(fā)Web 服務(wù)器:

服務(wù)器啟動(dòng)后,會(huì)進(jìn)入輪詢,等待并處理請(qǐng)求。輪詢會(huì)一直運(yùn)行,直到程序停止
開發(fā)過程中啟用調(diào)試模式會(huì)帶來一些便利,比如激活調(diào)試器、重載程序等。
Flask 提供的Web 服務(wù)器不適合在生產(chǎn)環(huán)境中使用。
一個(gè)完整的Flask 程序

將其作為參數(shù)傳入視圖函數(shù),視圖函數(shù)就能夠訪問請(qǐng)求對(duì)象。為了避免大量可有可無的視圖函數(shù):
Flask 使用上下文臨時(shí)把某些對(duì)象變?yōu)槿挚稍L問。


Flask 中有兩種上下文:程序上下文和請(qǐng)求上下文,使用上下文臨時(shí)把某些對(duì)象變?yōu)槿挚稍L問,讓視圖函數(shù)能夠訪問請(qǐng)求對(duì)象。
程序上下文被推送后,就可以在線程中使用current_app 和g 變量。
請(qǐng)求上下文被推送后,就可以使用request 和session 變量。
Flask 在分發(fā)請(qǐng)求之前激活(或推送)程序和請(qǐng)求上下文,請(qǐng)求處理完成后再將其刪除。如果使用這些變量時(shí)我們沒有激活程序上下文或請(qǐng)求上下文,就會(huì)導(dǎo)致錯(cuò)誤。


沒激活程序上下文之前就調(diào)用current_app.name 會(huì)導(dǎo)致錯(cuò)誤,但推送完上下文之后就可以調(diào)用了。
在程序?qū)嵗?b>調(diào)用app.app_context() 可獲得一個(gè)程序上下文。
程序收到客戶端發(fā)來的請(qǐng)求時(shí),要找到處理該請(qǐng)求的視圖函數(shù),F(xiàn)lask會(huì)在程序的URL 映射中查找請(qǐng)求的URL。
URL 映射:
URL 映射是URL 和視圖函數(shù)之間的對(duì)應(yīng)關(guān)系。
生成映射:
Flask 使用app.route 修飾器或者非修飾器形式的app.add_url_rule() 生成映射。
查看Flask 程序中的URL 映射:

URL 映射中的HEAD、Options、GET 是請(qǐng)求方法,由路由進(jìn)行處理。
Flask 為每個(gè)路由都指定了請(qǐng)求方法,這樣不同的請(qǐng)求方法發(fā)送到相同的URL 上時(shí),會(huì)使用不同的視圖函數(shù)進(jìn)行處理。
Flask注冊(cè)通用函數(shù)的功能:
注冊(cè)的函數(shù)可在請(qǐng)求被分發(fā)到視圖函數(shù)之前或之后調(diào)用。
Flask 支持以下4 種鉤子:
? before_first_request:注冊(cè)一個(gè)函數(shù),在處理第一個(gè)請(qǐng)求之前運(yùn)行。?
? before_request:注冊(cè)一個(gè)函數(shù),在每次請(qǐng)求之前運(yùn)行。
? after_request:注冊(cè)一個(gè)函數(shù),如果沒有未處理的異常拋出,在每次請(qǐng)求之后運(yùn)行。
? teardown_request:注冊(cè)一個(gè)函數(shù),即使有未處理的異常拋出,也在每次請(qǐng)求之后運(yùn)行。