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后面的代碼將不會被執行
設置響應對象的格式:
4 在 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屬性,使用它可以為整個資掘類的所有視圖方法附加裝飾器
水電費