1. 程式人生 > >關於Flask的一些筆記.md

關於Flask的一些筆記.md

關於Flask的一些筆記

Python

路由和檢視函式

  1. Flask物件的初始化是程式例項,一般的引數為程式主模組或包的名字,一般的Python.__name__屬性即可。建構函式Flask根據這個引數找到程式的根目錄,或者資源的根檔案; app = Flask(--name--)

    客戶端(瀏覽器等)傳送一個(Http)請求,對應的web伺服器處理會把請求傳送給Flask例項,也就是當前的app。這個例項根據這個請求的URL,執行對應的程式碼,返回響應。處理URL和程式碼對映的過程叫路由。在Flask中就是使用物件app.route函式裝飾器,來進行路由處理的。這個裝飾器裝飾的函式是一個檢視函式。

    Python程式碼中嵌入字串響應中會使程式碼難以維護,不建議使用。而使用模板進行處理。 另,URL對映除了裝飾器外,還有非裝飾器格式的app.add_url_rule()

  2. 路由可以使用動態控制,動態部分的佔位預設為字串,也可以是int、path、float型別的;app.route('/user/<int:id>')

程式和請求上下文

  1. Flask收到請求後,檢視函式處理的應該是一些請求物件。但是如果給每個檢視函式都加上這些物件的引數,不便於程式碼維護和設計原則;Flask提供了一些上下文物件,暫時是全域性可訪問的。Flask中有程式上下文(current_app/g)和請求上下文(request/session)。 Flask在呼叫檢視函式後,一般返回些簡單的字串,並且包含狀態碼(預設200) 響應的物件,可以是一個匿名的由返回字串、狀態碼和頭部訊息,也可以使用response物件進行封裝 也可以使用模板進行響應的抽離

  2. 我們希望web服務能夠使用模板,將業務邏輯和表現邏輯分開:

    在這裡插入圖片描述

    • 模板中使用佔位符,動態的將響應的內容載入進業務最終的邏輯檢視中,呈現給使用者。使用動態變數代替佔位符的過程叫渲染。在渲染中,也可以動態的在路由中增加引數即變數,這些變數還可以進行過濾。
    • jinja2的模板中,可以識別所有的資料型別:包括列表、字典、物件等;jinja2模板預設會對所有的變數進行轉義,所以在進行含有HMML的引數傳遞時,要使用safe過濾器。

Bootstrap

  1. Bootstrap集成了一些css和js的HTML基礎樣式,可以看成是一種拓展的模板,可以進行更好的適配和優良的圖形風格的包裝。
  2. Bootstrap是客戶端的框架,不會影響到服務端的操作,服務端只需引用即可。使用url_for函式可以代替html檔案中寫死的連結,而實現動態的變化

表單

  1. Flask-WTF能保護所有表單免受跨站請求偽造。每個表單繼承自一個Form類,其中有多個欄位物件,附帶多個驗證函式。欄位建構函式的第一個引數是把表單渲染成HTML的格式。

  2. 在表單中重新填寫資料,但是不點選提交而是重新整理瀏覽器時,會出現一個警告(post請求的)——瀏覽器會直接傳送已處理的最後一個請求。所以建議一般post請求使用重定向的方式。重定向會使用URL定向到另一個地址,然後給這個URL傳送GET請求。 這樣一來,重定向後GET請求保留不了post請求中的資料,則使用session控制。

  3. 預設情況會使用cookies記錄使用者會話,cookies是本地儲存的,使用設定過的secret_key進行加密簽名;一旦cookies被篡改簽名就會失效,cookies本身也將過期

  4. session可以看成一個字典,一般不使用直接的鍵對映,而使用get,這樣不存在鍵值是會返回None值;

資料庫

  1. 資料中,具有ORM和ODM兩種模型,前者成為物件關係對映,後者稱為文件關係對映。可以將資料庫的操作對映到面向物件的高階模型中。這兩種把物件業務轉換成資料庫業務會有一定的損耗,但大部分情況下,這點損失能夠帶來更高的生產效率。
  2. SQLAlchemy ORM是Flask框架中提供的抽象層,支援多種關係型資料庫引擎,包括MySQL、Postgres和SQLite。它是一個較強的關係型資料庫框架,提供了高層ORM,也提供了使用資料庫原生SQL的低層功能。程式中一般將資料庫URL儲存到Flask配置物件的配置檔案一個KEY中(並且有一個key可以設定每次修改後的自動commit)。
  3. Flask-SQLAlchemy的資料庫例項提供一個基類、一些函式和輔助函式定義模型結構。如db.model、db.Column等。不指定表名則會使用類名作為預設表名。
  4. 表間關係定義時,被參考的外來鍵要使用db.relationship()函式定義,在主表中的Column函式定義中使用db.ForeignKey()函式說明。
  5. 資料庫操作中有一個會話session,來管理資料庫所作的改動,由db.session表示。

大型程式的結構

Flask並不強調大型專案使用特定的組織方式

  1. 配置選項:多個配置,開發、測試和生產環境需要不同的資料庫等
  2. 程式工廠函式(_init_.py),是能夠動態地實現程式例項的建立,將這些過程遷移到可顯示呼叫的工廠函式,減少了全域性化。配置類中的物件可以直接通過from_object方法匯入。
  3. 藍本:預定義路由的操作,可以將另外定義的路由及檢視函式的檔案如view,裝載入藍本檔案中。再將藍本在工廠函式create_app中註冊,這樣通過create_app,就將預定義的路由經由藍本,和程式例項app物件聯絡到一起了。

例項專案的問題

  1. 一般的專案使用virtualvenv即一個虛擬的環境副本較好,不影響其他或者本地的設定。需要拓展的庫和包也都安裝在虛擬環境下
  2. 在專案中,虛擬環境下每次安裝了新的庫後,使用pip freeze > requirement.txt寫入;進行專案遷移後,可以重新在虛擬環境下pip install -r requirement.txt一鍵安裝所有依賴