Flask 關於響應

2021-09-24 07:21:01 字數 2773 閱讀 2063

檢視函式的返回值會被自動轉換為乙個響應物件。如果返回值是乙個字串, 它被轉換為該字串為主體的、狀態碼為 200 ok``的 、 mime 型別是 ``text/html 的響應物件。flask 把返回值轉換為響應物件的邏輯是這樣:

如果返回的是乙個合法的響應物件,它會從檢視直接返回。

如果返回的是乙個字串,響應物件會用字串資料和預設引數建立。

如果返回的是乙個元組,且元組中的元素可以提供額外的資訊。這樣的元組必須是 (response, status, headers) 的形式,且至少包含乙個元素。 status 值會覆蓋狀態**, headers 可以是乙個列表或字典,作為額外的訊息標頭值。

如果上述條件均不滿足, flask 會假設返回值是乙個合法的 wsgi 應用程式,並轉換為乙個請求物件。

如果你想在檢視裡操縱上述步驟結果的響應物件,可以使用 make_response() 函式。

譬如你有這樣乙個檢視:

def not_found(error):

return render_template('error.html'), 404

你只需要把返回值表示式傳遞給 make_response() ,獲取結果物件並修改,然後再返回它:

def not_found(error):

resp = make_response(render_template('error.html'), 404)

resp.headers['x-something'] = 'a value'

return resp

除請求物件之外,還有乙個 session 物件。它允許你在不同請求間儲存特定使用者的資訊。它是在 cookies 的基礎上實現的,並且對 cookies 進行金鑰簽名。這意味著使用者可以檢視你 cookie 的內容,但卻不能修改它,除非使用者知道簽名的金鑰。

要使用會話,你需要設定乙個金鑰。這裡介紹會話如何工作:

from flask import flask, session, redirect, url_for, escape, request

def index():

if 'username' in session:

return 'logged in as %s' % escape(session['username'])

return 'you are not logged in'

def login():

if request.method == 'post':

session['username'] = request.form['username']

return redirect(url_for('index'))

return ''''''

def logout():

# remove the username from the session if it's there

session.pop('username', none)

return redirect(url_for('index'))

# set the secret key. keep this really secret:

這裡提到的 escape() 可以在你模板引擎外做轉義(如同本例)。

如何生成強壯的金鑰

隨機的問題在於很難判斷什麼是真隨機。乙個金鑰應該足夠隨機。你的作業系統可以基於乙個金鑰隨機生成器來生成漂亮的隨機值,這個值可以用來做金鑰:

>>> import os

>>> os.urandom(24)

'\xfd{h\xe5<\x95\xf9\xe3\x96.5\xd1\x01o把這個值複製貼上進你的**中,你就有了金鑰。

使用基於 cookie 的會話需注意: flask 會將你放進會話物件的值序列化至 cookies。如果你發現某些值在請求之間並沒有持久存在,然而確實已經啟用了 cookies,但也沒有得到明確的錯誤資訊。這時,請檢查你的頁面響應中的 cookies 的大小,並與 web 瀏覽器所支援的大小對比。

反饋,是良好的應用和使用者介面的重要構成。如果使用者得不到足夠的反饋,他們很可能開始厭惡這個應用。 flask 提供了訊息閃現系統,可以簡單地給使用者反饋。 訊息閃現系統通常會在請求結束時記錄資訊,並在下乙個(且僅在下乙個)請求中訪問記錄的資訊。展現這些訊息通常結合要模板布局。

使用 flash() 方法可以閃現一條訊息。要操作訊息本身,請使用get_flashed_messages() 函式,並且在模板中也可以使用。完整的例子見 訊息閃現

部分。0.3 新版功能.

有時候你會處於這樣一種境地,你處理的資料本應該是正確的,但實際上不是。 比如,你會有一些向伺服器傳送請求的客戶端**,但請求顯然是畸形的。這可能是使用者篡改了資料,或是客戶端**的粗製濫造。大多數情況下,正常地返回 400 bad request 就可以了,但是有時候不能這麼做,並且要讓**繼續執行。

你可能依然想要記錄下,是什麼不對勁。這時日誌記錄就派上了用場。從 flask 0.3 開始,flask 就已經預置了日誌系統。

這裡有一些呼叫日誌記錄的例子:

附帶的 logger 是乙個標準日誌類 logger ,所以更多資訊請查閱 logging 的文件 。

如果你想給你的應用新增 wsgi 中介軟體,你可以封裝內部 wsgi 應用。例如若是你想用 werkzeug 包中的某個中介軟體來應付 lighttpd 中的 bugs ,可以這樣做:

from werkzeug.contrib.fixers import lighttpdcgirootfix

準備好部署你的 flask 應用了?你可以立即部署到託管平台來圓滿完成快速入門,以下廠商均向小專案提供免費的方案:

託管 flask 應用的其它選擇:

Flask 請求 響應

map get,head,options index static get,head,options static user get,head,options user url 對映中head options get是請求方法,由路由進行處理。flask為每個路由都指定了請求方法,這樣不同的請求方法...

Flask 請求響應迴圈

避免大量重複引數的訪問導致檢視函式 重複 亂的問題,flask使用上下文是一些變數再乙個執行緒中全域性可訪問,不會干擾其他執行緒。變數名上下文 說明程式上下文 當前啟用程式的程式例項 g程式上下文 處理請求時用於臨時儲存的物件,每次請求會重設g request 請求上下文 請求物件,封裝了http請...

Flask 關於Flask的request屬性

在進行flask開發中,前端需要傳送不同的請求及各種帶引數的方式,比如get方法在url後面帶引數和post在body帶引數,有時候又是post的表單提交方式,這個時候就需要從request提取引數。這篇文章是總結如何使用request。在flask的官方文件中是這樣介紹request的 對於 we...