Python全棧工程師之從網頁搭建入門到Flask全棧項目實戰(3) – 入門Flask微框架

1.安裝Flask

  • 方式一:使用pip命令安裝
pip install flask
  • 方式二:源碼安裝
python setup.py install
  • 驗證

第一個Flask程式

程式解釋

  • 參數__name__:表示Flask應用的主模組或包的名稱。Flask使用該參數確定應用的位置,然後找到應用中其他文件的位置,如網頁中的圖片目錄,模組目錄;參數寫成__name__就代表是想要得到主模組的實例;找其他文件的話,Flask()括弧中參數需要填其他內容
  • 裝飾器app.route():表示一個路由配置,即:用戶在瀏覽器輸入URL,使用對應的函數處理其中的業務邏輯(可寫多個);app.route(『/』)拿百度url舉例,就像//www.baidu.com/,匹配到最後的「/」根路徑下,在hello_world函數中處理業務邏輯

 

2.MTV模型

MTV模型簡述:在視圖模組中通過函數把模型當中的數據取出來,將取出來的數據傳給模板進行展示

MTV的設計模式和請求響應過程:
1,用戶進入網站,發起request請求
2,View接受請求,進行業務邏輯處理後,並同時向Model和Template發送指令
3,Model進行數據分析,然後將獲取的數據返回給View
4,Template獲取html頁面,然後將獲取的頁面內容返回給View
5,View將Model中返回的數據渲染到Template中,並將數據以特定的格式返回給用戶

示例-Code

模板:可以理解為我們的模板是html;負責如何把頁面展示給用戶(html)

視圖:示例程式碼app.py的def hello()函數;可以理解為,視圖就是我們的函數;負責業務邏輯,對應項目中的視圖函數

模型:當前示例沒有;模型可以理解為就是我們從資料庫取出來的某一條記錄;與資料庫相關

備註:在實際開發過程中,mtv模型不是所有的模組都必須有的,模板可以沒有,模型可以沒有,但是視圖是要一定存在的;mtv模型是可以有部分缺失的,因為flask是微框架,我們只需要實現其核心功能就可以了,即視圖

flask常見mtv擴展:

3.Flask擴展

3.1.啟動選項及調試

啟動伺服器

演示👇:

開啟調試模式:目的是為了我們的程式碼修改後,伺服器自動重啟,使修改後程式碼生效

實操👇:

3.2.Flask的擴展

//pypi.org/

4.PyCharm URL配置及路由

4.1.PyCharm URL配置

URL對應視圖函數就是路由的過程;在瀏覽器中輸入URL,函數進行怎樣的響應

pycharm配置

step-1:module name的flask指的就是我們在控制台運行前面的命令flask

step-2:設置參數run、IP地址以及埠號

step-3:設置環境變數,FLASK_APP根據實際py文件填寫;配置ENV,我們用的是開發環境development

step-4:選擇python解釋器

 備註:如果找到解釋器怎麼辦?

選擇你的項目project圖示模組interpreter,如果還沒有,點擊show all

點擊+號

點擊虛擬環境模組(前提是你的項目是用的虛擬環境),選擇新建一個或者Existing environment指定已有的都可以

step-5:點擊Apply+OK,運行檢驗

4.2.路由配置

注意:方式二不常用

示例:

4.3.路由匹配規則

定義路由路徑該怎麼定義,有什麼章法沒有?那我們就得知道路由他匹配的規則

路由常用功能: 

1)查看URL規則列表,URL規則列表其實就是網站的路由表

app.url_map

2)URL逆向解析(根據名稱解析成URL字元串)

<1>url_for(url_name,**kwargs)
<2>靜態文件(js/css/圖片)引用
   url_for('static',filename='style.css')

3)視圖函數中獲取頁面傳值

👇分頁功能經常會用到這個功能,第一頁基本設計上是不會傳參的

5. Flask請求與響應報文

5.1.Flask請求-響應上下文對象

請求分派也可以理解為路由分發的過程,根據app.route裝飾器識別對應視圖函數

上下文對象簡述:

  • 上下文分為應用上下文和請求上下文,在編程的過程當中,我們不需要關注應用和請求細微的差別,但是我們要理解什麼是上下文,以及他們共同的特點
  • 在分派請求之前激活應用上下文和請求上下文
  • 在請求處理完成後將其刪除

 

應用上下文對象

  • current_app:當前應用的實例,可以理解為即下圖的app

  • g:處理請求時的臨時存儲對象,每次請求都會重設這個變數
  • 定義的時候講了,current_app代表當前應用的實例;然後呢,當前應用的實例我們用app來接的。app和current_app目前表示的應該一個東西,通過列印各自的內容、==判別時發現結果是一樣的。但是通過is來判斷兩個是不是同一個時,結果為False。簡單理解記憶:current_app和示例程式碼應用實例對象app裡面的內容是一樣的,但是他倆不是一個東西就行。

請求上下文對象

  • request:請求對象,封裝了客戶端發出的HTTP請求中的內容
  • session:用戶會話,各請求之間的數據共享

5.2.請求報文

請求報文_常用參數

  • method:請求的類型(GET/POST/OPTIONS等)
  • form:POST請求數據dict
  • args:GET請求數據dict
  • values:POST請求和GET請求數據集合dict
  • files:上傳的文件數據dict
  • cookies:請求中的cookie dict
  • headers:HTTP請求頭

請求報文_練習

1)獲取get參數(request.args):請求不傳,默認是None;獲取get參數時,對未傳值參數可以賦予默認值,常見應用場景為分頁

 

2)解析請求頭中的IP地址((request.headers):通過request.headers.get()獲取請求頭相關資訊;request.remote_addr獲取遠程客戶端ip地址

5.3.請求鉤子

問題:如下場景如何實現?

  • 每個請求中都要驗證用戶資訊(是否已登錄、是否有許可權訪問)
  • 限制來自某些IP的惡意請求

針對上述問題,就可以使用鉤子函數來解決;同時使用鉤子函數可以減少重複程式碼的編寫,便於維護;具體請求鉤子裝飾器函數如下:

  • before_first_request:伺服器初始化後第一個請求到達前執行
  • before_request:每一個請求到達前執行
  • after_request:每次請求處理完成後執行,如果請求過程中產生了異常,則不執行
  • teardown_request:每次請求處理 完成後執行,如果請求過程中產生了異常也執行

5.4.響應報文

響應報文包含內容常用如下:

  • response:響應內容
  • status:響應狀態碼
  • headers:響應頭資訊

 

那如何修改響應報文內容呢?常見方法如下:

1)在return的時候將響應報文內容加上:響應內容、響應狀態碼、自定義響應頭資訊;不常用

2)構造一個響應對象make_response;常用

響應對象方式一:構造的時候就將響應報文內容傳進去

 響應對象方式二:先將對象構造好,修改對象對應屬性的值

  • make_response().headers:自定義響應頭
  • make_response().status_code:響應狀態碼
  • make_response().response:響應內容

問:如果響應內容我想返回圖片影片,或者文字字體顏色、樣式、大小都要訂製怎麼辦呢?

解決方案:響應內容以html返回,可以用html文件作為響應內容傳到響應對象 make_response()裡面;

新建一個Directory,名字命名為templates,將html文件放在該目錄下,注意目錄名字一定得叫這個,後面筆記內容會解釋為什麼叫這個名字;通過render_template生成html對象,傳給make_response()響應對象。

6. Flask視圖

重定向等內部視圖

1)redirect():實現重定向,常見場景用於退出/登陸後重定向網頁頁面

2)abort():處理錯誤,針對錯誤的狀態碼主動拋出報錯;abort後面不需要再加return

問:能不能指定報錯頁面展示、或者自定義報錯頁面返回給客戶端展示?

示例程式碼模擬場景:對黑名單下的ip地址進行攔截,返回403狀態碼沒有許可權訪問,並自定義報錯頁面;通過裝飾器@app.errorhandler()的函數對abort()拋出的狀態碼進行處理,注意@app.errorhandler()修飾的函數要傳入參數err,列印出來發現err是403/404對應的報錯資訊