flask入門day03
錯誤處理
1.abort函數:放棄請求并返回錯誤代碼
詳細狀態碼
from flask import Flask,abort,render_template
?
app = Flask(__name__)
?
@app.route('/')
def index():return '我是首頁'
?
@app.route('/error')
def error():abort(404)return '沒有找到頁面'
?
if __name__ == '__main__':app.run(debug=True,port=8088)
但是以上的方法,頁面會直接顯示成這樣的,用戶可能不是很聰明,會以為是網站的問題,為了解決以上的內容,請看下面的講解
自定義錯誤處理視圖
-
使用 errorhandler 裝飾器,接受一個http狀態碼為參數。
-
自定義的錯誤視圖不單單作用于abort函數拋出的錯誤,也作用于整個Flask應用對應錯誤碼。
-
自定義錯誤處理視圖接收一個參數,是Flask應用的默認報錯信息
from flask import Flask,render_template
?
app = Flask(__name__)
?
@app.route('/')
def index():return '我是首頁'
?
@app.errorhandler(404)
def error(e):# 函數里面必須要傳入一個參數# 自定義錯誤處理視圖函數# 使用 errorhandler 裝飾器,接受一個http狀態碼為參數。# 自定義的錯誤視圖不單單作用于abort函數拋出的錯誤,也作用于整個Flask應用對應錯誤碼。# 自定義錯誤處理視圖接收一個參數,是Flask應用的默認報錯信息# 可以有多個errorhandler處理不同的錯誤return render_template('error.html')
?
if __name__ == '__main__':app.run(debug=True,port=8088)
可以制作一個錯誤顯示頁面,當用戶找不到頁面的時候,讓他可以跳轉回首頁
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>頁面未找到 - 404錯誤</title><style>* {margin: 0;padding: 0;box-sizing: border-box;font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;}body {min-height: 100vh;display: flex;justify-content: center;align-items: center;background: #f8f9fa;padding: 20px;color: #333;line-height: 1.6;}.container {text-align: center;max-width: 500px;width: 100%;padding: 40px;background: white;border-radius: 12px;box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05);}.error-code {font-size: 7rem;font-weight: 800;color: #6e8efb;margin-bottom: 15px;line-height: 1;}h1 {font-size: 2rem;margin-bottom: 20px;color: #444;}p {font-size: 1.1rem;margin-bottom: 30px;color: #666;}.home-btn {display: inline-block;padding: 14px 40px;background: #6e8efb;color: white;text-decoration: none;border-radius: 6px;font-weight: 600;font-size: 1.1rem;transition: all 0.2s ease;border: 2px solid #6e8efb;margin-top: 20px;}.home-btn:hover {background: white;color: #6e8efb;}.error-icon {font-size: 6rem;color: #6e8efb;margin-bottom: 20px;opacity: 0.8;}.links {display: flex;justify-content: center;gap: 25px;margin-top: 40px;flex-wrap: wrap;}.links a {color: #6e8efb;text-decoration: none;font-weight: 500;}.links a:hover {text-decoration: underline;}@media (max-width: 768px) {.container {padding: 30px 25px;}.error-code {font-size: 5.5rem;}h1 {font-size: 1.7rem;}p {font-size: 1rem;}}@media (max-width: 480px) {.error-code {font-size: 4.5rem;}h1 {font-size: 1.5rem;}.home-btn {padding: 12px 30px;font-size: 1rem;}.links {gap: 15px;}}</style>
</head>
<body><div class="container"><div class="error-icon">?</div><div class="error-code">404</div><h1>頁面未找到</h1><p>您訪問的頁面可能已被移除或暫時不可用。請檢查URL是否正確,或返回首頁繼續瀏覽。</p><a href="/" class="home-btn">返回首頁</a><div class="links"><a href="#">聯系我們</a><a href="#">幫助中心</a><a href="#">網站地圖</a></div></div>
</body>
</html>
響應數據
認識響應
視圖函數的 return 值會自動轉換為一個響應對象。如果返回值是一個字符串, 它被轉換為該字符串為主體的、狀態碼為 200 的 ,MIME 類型是 text/html 的響應對象。
Flask 把返回值轉換為響應對象的邏輯:
-
如果返回的是一個字符串,響應對象會用字符串數據和默認參數創建。
-
如果返回的是一個元組,且元組中的元素可以提供額外的信息。這樣的元組必須是 (response,status, headers) 的形式,且至少包含一個元素。 status 值會覆蓋狀態代碼, headers 可以是一個列表元素是元祖或字典,作為額外的消息標頭值。
-
如果返回的是一個合法的響應對象,它會從視圖直接返回。
我們之前都是直接返回字符串,Flask會幫我們自動創建response對象。
響應內容可以是列表套元組來構建
from flask import Flask
?
app = Flask(__name__)
?
@app.route('/')
def index():return '我是首頁',200,[('subject','python'),( 'chapter', 2)]
?
if __name__ == '__main__':app.run(debug=True,port=8088)
響應也可以是字典的形式構建
from flask import Flask
?
app = Flask(__name__)
?
@app.route('/')
def index():# [('subject','python'),( 'chapter', 2)]return '我是首頁',200,{'subject':'python','chapter':'2'}
?
if __name__ == '__main__':app.run(debug=True,port=8088)
查看返回的響應的內容
響應對象
make_response 創建響應對象
@app.route('/')
def index():response = make_response('hello world')# 方式1# response.status_code = 200# 方式2response.status = 200response.headers['subject'] = 'python'return response
返回json數據
在前面內容中我們都是返回字符串,但是很多web開發中都是要求前后端分離的,前端一般會要求后端返回json數據。
在django的學習中我們知道返回json數據有一個JsonResponse對象,接收一個python字典作為參數。Flask中也有一個類似的對象可以返回json數據。
make_response方式返回json對象
from flask import Flask,make_response,json
?
app = Flask(__name__)
?
@app.route('/')
def index():my_dict = {"status":'200',"object":'python'}response = make_response(json.dumps(my_dict),200)response.headers['Content-Type'] = 'application/json'return response
?
if __name__ == '__main__':app.run(debug=True,port=8088)
jsonify: 返回json格式的數據,更加簡便
from flask import Flask,jsonify
?
app = Flask(__name__)
?
@app.route('/')
def index():my_dict = {"status":'200',"object":'python'}return jsonify(my_dict)
?
if __name__ == '__main__':app.run(debug=True,port=8088)
Cookie
設置cookie
cookie 是以鍵值對的形式保存在瀏覽器中。
設置cookie我們比較關心的三個參數:
key cookie的鍵
value cookie的值
max_age=None 超時時間,單位是秒
expires=None 超時時間,datatime對象
from flask import Flask,make_response
?
app = Flask(__name__)
?
@app.route('/')
def index():response = make_response('設置Cookie')response.status_code = 200# 設置Cookie,鍵為name,值為python,存活時間為10秒response.set_cookie('name','python',max_age=10)return response
if __name__ == '__main__':app.run(debug=True,port=8088)
在瀏覽器控制臺的緩存中,查看cookie值
獲取cookie
@app.route('/getcookie')
def get_cookie():cookie = request.cookies.get('name','Not Font')return cookie
刪除cookie
@app.route('/delcookie')
def del_cookie():response = make_response('刪除cookie')response.delete_cookie('name')return response
Session
在Flask中,我們并沒有數據庫配置,實際上Flask的session是基于cookie加secret_key 進行加密后保存在cookie中的。
設置session
from flask import Flask,session
import os
app = Flask(__name__)
# 設置session要生成密鑰SECRET_KEY
app.config['SECRET_KEY'] = os.urandom(24)
@app.route('/setcookie')
def set_cookie():session['myname'] = 'python'session['password'] = '123456'return 'session'
?
if __name__ == '__main__':app.run(debug=True,port=8088)
獲取session
@app.route('/getsession')
def get_session():# 獲取session采用[key]方式取值,如果key不存在會報錯。myname = session['myname']# 獲取session 采用get方式取值,如果key不存在返回Nonepassword = session.get('password',"none")return f'myname:{myname},password:{password}'
刪除session
可以直接使用session.pop('key',None):
session.pop('name',None)
如果要刪除session中所有數據使用:clear():
session.clear()
@app.route('/delsession')
def del_session():# 刪除key為mynamesession.pop('myname',None)# 刪除所有的session.clear()return '刪除session'
設置session過期時間
Flask的默認session利用了Werkzeug的SecureCookie,把信息做序列化(pickle)后編碼(base64),放到cookie里了。
過期時間是通過cookie的過期時間實現的。
為了防止cookie內容被篡改,session會自動打上一個叫session的hash串,這個串是經過session內容、SECRET_KEY計算出來的,看得出,這種設計雖然不能保證session里的內容不泄露,但至少防止了不被篡改。
過期時間是這樣來設置:
from datetime import timedelta
app = Flask(__name__)
session.permanent = True
# session過期時間設置為5分鐘
app.permanent_session_lifetime = timedelta(minutes=5)