Flask學(xué)習(xí)之四----一些基礎(chǔ)概念2

一,重定向和錯誤
你可以用redirect函數(shù)把用戶重定向到其它地方。放棄請求并返回錯誤代碼,用 abort 函數(shù)。這里是一個它們?nèi)绾问褂玫睦?
from flask import abort, redirect, url_for
@app.route('/')
def index():
return redirect(url_for('login'))

@app.route('/login')
def login():
abort(401)
this_is_never_executed()
默認情況下,錯誤代碼會顯示一個黑白的錯誤頁面。如果你要定制錯誤頁面, 可以使用errorhandler()裝飾器:
from flask import render_template
@app.errorhandler(404)
def page_not_found(error):
return render_template('page_not_found.html'), 404
注意 render_template調(diào)用之后的 404。這告訴 Flask,該頁的錯誤代碼是 404 ,即沒有找到。默認為 200,也就是一切正常。
二,關(guān)于響應(yīng)
視圖函數(shù)的返回值會被自動轉(zhuǎn)換為一個響應(yīng)對象。如果返回值是一個字符串, 它被轉(zhuǎn)換為該字符串為主體的、狀態(tài)碼為 200 OK的 、 MIME 類型是text/html
的響應(yīng)對象。Flask 把返回值轉(zhuǎn)換為響應(yīng)對象的邏輯是這樣:
如果返回的是一個合法的響應(yīng)對象,它會從視圖直接返回。
如果返回的是一個字符串,響應(yīng)對象會用字符串數(shù)據(jù)和默認參數(shù)創(chuàng)建。
如果返回的是一個元組,且元組中的元素可以提供額外的信息。這樣的元組必須是 (response, status, headers)
的形式,且至少包含一個元素。 status
值會覆蓋狀態(tài)代碼, headers
可以是一個列表或字典,作為額外的消息標頭值。
如果上述條件均不滿足, Flask 會假設(shè)返回值是一個合法的 WSGI 應(yīng)用程序,并轉(zhuǎn)換為一個請求對象。
如果你想在視圖里操縱上述步驟結(jié)果的響應(yīng)對象,可以使用 make_response 函數(shù)。
譬如你有這樣一個視圖:
@app.errorhandler(404)
def not_found(error):
return render_template('error.html'), 404
你只需要把返回值表達式傳遞給make_response(),獲取結(jié)果對象并修改,然后再返回它:
@app.errorhandler(404)
def not_found(error):
resp = make_response(render_template('error.html'), 404)
resp.headers['X-Something'] = 'A value'
return resp

三,會話
除請求對象之外,還有一個 session對象。它允許你在不同請求間存儲特定用戶的信息。它是在 Cookies 的基礎(chǔ)上實現(xiàn)的,并且對 Cookies 進行密鑰簽名。這意味著用戶可以查看你 Cookie 的內(nèi)容,但卻不能修改它,除非用戶知道簽名的密鑰。
要使用會話,你需要設(shè)置一個密鑰。這里介紹會話如何工作:
from flask import Flask, session, redirect, url_for, escape, request

app = Flask(name)

@app.route('/')
def index():
if 'username' in session:
return 'Logged in as %s' % escape(session['username'])
return 'You are not logged in'

@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
return '''
<form action="" method="post">
<p><input type=text name=username>
<p><input type=submit value=Login>
</form>
'''

@app.route('/logout')
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:

app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
如何生成強壯的密鑰
隨機的問題在于很難判斷什么是真隨機。一個密鑰應(yīng)該足夠隨機。你的操作系統(tǒng)可以基于一個密鑰隨機生成器來生成漂亮的隨機值,這個值可以用來做密鑰:

import os
os.urandom(24)
'\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<!\xd5\xa2\xa0\x9fR"\xa1\xa8'
把這個值復(fù)制粘貼進你的代碼中,你就有了密鑰。
四,消息閃現(xiàn)
反饋,是良好的應(yīng)用和用戶界面的重要構(gòu)成。如果用戶得不到足夠的反饋,他們很可能開始厭惡這個應(yīng)用。 Flask 提供了消息閃現(xiàn)系統(tǒng),可以簡單地給用戶反饋。 消息閃現(xiàn)系統(tǒng)通常會在請求結(jié)束時記錄信息,并在下一個(且僅在下一個)請求中訪問記錄的信息。展現(xiàn)這些消息通常結(jié)合要模板布局。
使用 flash()方法可以閃現(xiàn)一條消息。要操作消息本身,請使用get_flashed_messages()函數(shù),并且在模板中也可以使用。
五,日志記錄
這里有一些調(diào)用日志記錄的例子:
app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')
附帶的 logger是一個標準日志類Logger
六,整合 WSGI 中間件
如果你想給你的應(yīng)用添加 WSGI 中間件,你可以封裝內(nèi)部 WSGI 應(yīng)用。例如若是你想用 Werkzeug 包中的某個中間件來應(yīng)付 lighttpd 中的 bugs ,可以這樣做:
from werkzeug.contrib.fixers import LighttpdCGIRootFix
app.wsgi_app = LighttpdCGIRootFix(app.wsgi_app)
七,部署到 Web 服務(wù)器
如果你有自己的主機,并且準備自己托管,參考http://docs.jinkan.org/docs/flask/deploying/index.html#deployment

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容