《Flask Web開發實戰:入門、進階與原理解析》 學習筆記 好書呀


1 一個視圖函數可以綁個 URL
2 為了讓互聯網上的人都可以訪問,需要安裝程序的服務器有公網ip

3 如果過度使用擴展,在不需要 的地方引人,那么相應也會導致代碼不容易維護 ,應該盡從實際需求出發,只在需要 的時候使用擴展

4 flask、flask擴展、程序自己的環境變量都可以通過flask的app.config作為統一的接口來設置和獲取。app.config是字典的子類,所以可以像操作字典那樣使用它

5 session也可以像字典一樣使用

6 g也可以像字典一樣使用

7 配置變量可以存儲在python腳本、python類和json格式的文件中

 

 

 

 1 after_request 鈎子和 after_this_request 鈎子必須接收一個響應類象作參數,並且返回同 個或更新后的響應對象
2 響應報文的首部包含一些關於響應和服務器的信息,這些內容由 F lask 生成 ,視圖函數中返回的內容即為響應報文中的主體內容
圖菌數可以返回最多由 個元素組成的元組:響應主體、狀態碼、首部字段 其中首部字段可以為字典,或是兩元素元組組成的列表
3 abort()函數后面不需要return,因為abort后面的代碼將不會被執行
設置響應對象的格式:

在 Flask 中,如果想要在響應中添加一個 cookie , 最方便的方法是使用 Response 類提供的
set_cookie()方法 要使用這個方法,我需要先使用 make_response()方法手動生成一個響應對
response set_cookie (’ name ’, name )
name = request . cookies . get (' name ', Human ’) #從 Cookie 中獲取 name值


當我們使用 session 對象添加 cookie 時,數據會使用程序的密鑰對其進行簽名,加密后的數據存儲在塊名為 session 的 cookie 里
使用session 對象存儲的 Cookie ,用戶可以看到其加密后的值,但無法修改它 因為 session 中的內容使用密鑰進行簽名,一旦數據被修改,簽名的值也會變化這樣在讀取時,就會驗證失敗
過 session 對象的 pop 方法刪除設置的cookie 
默認情況下, session cookie 會在用戶關閉瀏覽器時刪除

==========服務器推送技術,除了下表列的方法,還有websocket 

 

 

 為防止攻擊,通過jinja的escape進行轉義,即把變量標記的內容標記為文本,而不是HTML代碼

 

 常見的攻擊:sql注入,跨站腳本攻擊,跨站偽造請求,頻繁請求

 

url_for生成的是相對url,若要生成絕對url,需要將_external參數設為true
MVC (Model-ViewController ,模型 - 視圖-控制器)

查詢字符串從問號?開始,以鍵值對的形式寫出,多個鍵值對之間使用&分隔 。

獲取request中的參數值,建議用get requset.args.get(’name’,’Human')

重定向回上一個頁面:
redirect(requset.referrer or url_for("hello"))
redirect(requset.args.get("next"),url_for("hello"))

jinja中常用定界符:
語句:{%%}
表達式: {{}}
注釋:{##}
Jinjia允許你在模板中使用大部分 Python 對象

{% if %}
{% else %}
{% endif %}

使用ORM的好處:方便切換數據庫(支持多種DBMS);ORM幫忙做了些防止sql注入的工作

自己寫sql的好處:靈活,快

表名生成規則:

 

 

 據庫和表一旦創建后,之后對模型的改動不會自動作用到實際的表中 如采使改動生效,最簡單的方式是調用 db. drop all()方法刪除數據庫和表,然后再調用 db . create_a ll()方法創建

我們在創建模型類實例的時候並沒有定義 id 字段的數據,這是因為主鍵由 SQLAlchemy 管理

一般來說,定義關系需要兩步,分別是創建外鍵和定義關系屬性。在更復雜的多對多關系中,我們還需要定義關聯表來管理關系 。

 動態url:使用“< 名>”的形式表示 @app . route ( ' /greet /<name> ' )

 

 flask中對應的MVC:  M->sqlAlchemy   V->jinja2  C->視圖函數

 

請求解析和 響應封裝實際上大部分是由 Werkzeug完成的,Flask子類化Werkzeug的請求( request)和響應( Response )對象並添加了和程序相關的特定功能

 

 訪問的頁面不存在,則會返回404錯誤

HEAD OPTIONS 方法的請求由Flask 處理 ,而像 DELETE 、 PUT 等方法一般不會在程序中實現,在后面我們構建 WebAPI 時才會用到這些方法

響應報文的首部包含一些關於響應和服務器的信息,這些內容由 F lask 生成

通過定義方法列表,我們可以為同一個 URL 規則定義多個視圖函數,分別處理不同 HTTP方法的請求

 

 每個鈎子可以注冊任多個處理函數,函數名並不是必須和鈎子名稱相同,
重定向會導致瀏覽器地址欄中的url放生變化

不過我們般並不直接使用 json 模塊的 dumps() load() 等方法,因為 Flask 通過包裝這些方法提供了更方便的 jsonify()函數
session存儲的內容通過簽名加密了,但通過工具可以輕易讀取(即使不知道秘鑰),所以session中不能存儲敏感信息

我們可以在視圖函數中或在視圖函數內調用的函數/方法中使用所有上下文全局變量。
重定向到上一個頁面:return redirect(request.referrer or url_for(’ hello ’) )   手動加入包含當前頁面 URL 的查詢參數,這個查詢參數一般命名為 next

 

 為了安全,需要對重定向路由做校驗

 

 

AJAX:讓我們可以在不重載頁面的情況下和服務器進行數據交換,在接收到響應數據后局部更新頁面

使用jQuery發送AJAX請求:jQuery包裝了JavaScript,可以更簡單的方式編寫JavaScript,更方便的操作ajax,同時處理了不通瀏覽器的AJAX兼容問題

美元符號是 jQuery 的簡寫,我們通過它來調用 jQuery 提供的多個方法,所以$.ajax()等同於jQuery.jax()

對於處理 AJAX 請求的視圖函數來說 ,我們不會返回完整的 HTML 響應,這時一般會返回局部數據

服務器推送技術:websocket(通過TCP實現的全雙工模式),兼容性也比SSE更強

安全問題:
1)SQL注入
如 利用url中的參數查數據庫
--使用ORM、校驗入參類型、參數化查詢
2)跨站腳本
如url參數中有js語句 或 提交的留言里有js語句--HTML轉義
--HTML轉義 、校驗入參
3)跨站請求
如B網站的一個圖片的src指向了A網站的一個接口,從而對A網站進行了操作
--令牌(偽隨機數)放到表單隱藏字段和session中

==============

WSGI 是開發 Python Web 程序的標准,所有的 Python Web 框架都需要按照 WSGI 的規范來
編寫程序 。 客戶端和服務器端進行溝通遵循了 HTTP 協議,從 HTTP 請求到我們的 Web 程序之間,還有另外一個轉換過程一一從 HTTP報文到 WSGI 規定的數據格式。

uWSGI、 Gunicorn 是實現了WSGI協議的web服務器

在Flask中使用 session 非常簡單 ,只需要設置好密鑰 ,就可以在視圖函數中操作session對象 
向 session 中存儲時, 會生成加密的 cookie 加時用的瀏覽器接收到響應會將 cookie 儲起來 戶再次發請求瀏覽器會自動在請求中加這個 cookie 值
Flask 接收把 session cookie 的值解析到 session 對象里 時我們可以再次從session讀取

Flask 提供的 session 將用戶會話存儲在客戶端 ,和這種存儲在客戶端的方式相反,另一種 實現用戶會話的方式是在服務器端存儲用戶會話 , 而客戶端只存儲一個 session ID 。當接收到客戶端 的請求時,可以根據 cookie 中的 session ID 來找到對應的用戶會話內容。這種方法更為安全和強健,你可以使用擴展 Flask-Session 來實現這種方式的session

當包或包內的模塊被導入時 , __init__.py文件將被自動執行 。

從__init__.py中導入變量時不需要注明__init__的路徑,只需要從包名稱導入

獲取UTC時間:
from datetime import datetime
datetime.utcnow()

Flask 允許加載多次配置,重復的配置以最后定義的配置為准

在藍本中,使用 before_request 、 after_request 、 teardown_request 等裝飾器注冊的請求處理函數是藍本獨有的
在藍本中也可以使用 before_app_request 、 after_app_request 、 teardown_app_request 、 before_app first_request 方法,這些方法注冊的請求處理函數是全局的

app.register_blueprint(auth bp , url prefix= ’/auth’ )#設置url前綴
app.register_blueprint(auth_bp , subdomain= ’auth’ )# 設置子域名 auth.exarnple.corn/login 的URL才會觸發auth藍本中的login視圖

 

url_for( ’ auth.login ’ ) #在全局生成藍本的url,需要帶上藍本名字。若在藍本內調用,可以使用url_for('.login')

若你在注冊藍本時為藍本定義了 URL 前綴,即設置了 url_prefix ,那么最終靜態文件路徑會自動設為“/藍本前綴/static ”,這時可以省略 static_url_path 的定義 。

通過給藍圖的before_request加login_required裝飾,從而實現對整個藍圖的所有函數加了登錄保護

可以在flash消息中添加視圖連接,Flash提供的Markup類可以將文本標記為安全文本,從而避免渲染時對Jinjia2進行轉義

裝飾器執行順序:

 

URL樣例:http ://api.example.com

 

 Flask 在 MethodView 類中提供了 decorators屬性,使用它可以為整個資掘類的所有視圖方法附加裝飾器

 

 






水電費





 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM