Flask錯誤處理與會話技術詳解

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)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93213.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93213.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93213.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java程序打包成exe,再打成安裝包,沒有jdk環境下可運行

一、前提條件準備&#xff1a;1、要被打包的程序文件&#xff1a;rest_assistant-1.0-SNAPSHOT.jarapplication.yml2、圖標文件tubiao123.ico3、jre4、打包成exe的軟件 config.exe4j5、打成安裝包的軟件 Inno Setup Compiler二、config.exe4j 的 exe打包配置步驟 按照以下圖進行…

區塊鏈技術原理(11)-以太坊交易

文章目錄什么是交易&#xff1f;交易類型交易生命周期關鍵概念&#xff1a;Gas 與交易費用交易狀態與失敗原因總結什么是交易&#xff1f; “交易&#xff08;Transaction&#xff09;” 是從一個賬戶向另一個賬戶發送的經過數字簽名的指令 。例如&#xff0c;如果 Bob 發送 A…

小兔鮮兒-小程序uni-app(二)

小兔鮮兒-小程序uni-app7.小兔鮮兒 - 用戶模塊會員中心頁(我的)靜態結構參考代碼會員設置頁分包預下載靜態結構退出登錄會員信息頁靜態結構獲取會員信息渲染會員信息更新會員頭像更新表單信息8.小兔鮮兒 - 地址模塊準備工作靜態結構地址管理頁地址表單頁動態設置標題新建地址頁…

BLE 廣播信道與數據信道:沖突避免、信道映射與自適應跳頻實現

低功耗藍牙(BLE)技術憑借低功耗、短距離、低成本的特性,已廣泛應用于智能家居、可穿戴設備、工業物聯網等領域。在 BLE 協議中,信道管理是保障通信可靠性的核心機制,其中廣播信道與數據信道的設計、沖突避免策略、跳頻技術更是面試中的高頻考點。本文將從基礎原理到實戰真…

nodejs03-常用模塊

nodejs 常用的核心模塊 Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環境&#xff0c; 它允許 JavaScript 運行在服務器端。Node.js 擁有豐富的標準庫&#xff0c;也就是核心模塊&#xff0c; 這些模塊提供了各種功能&#xff0c; 使得開發服務器端應用程序變得簡單高…

多路混音聲音播放芯片型號推薦

以下是唯創知音旗下主流的多路聲音播放芯片深度解析&#xff0c;結合精準參數、豐富場景及技術特性&#xff0c;滿足智能設備多樣化音頻需求&#xff1a;一、WTV380/890 系列&#xff1a;高集成多模態交互芯片核心參數通道能力&#xff1a;支持8 路獨立語音輸出&#xff0c;可同…

【C++】自研基 2 Cooley–Tukey

“自研基 2 Cooley–Tukey&#xff1a;倒位序 逐級蝶形&#xff0c;入口 fft(int N, complex f[])”拆成三件事它在講什么 “基 2 Cooley–Tukey” 指的是最常見的 FFT 算法&#xff1a;長度 N 必須是 2 的整數次冪&#xff0c;把離散傅里葉變換分解成一層一層的“2 點蝶形”運…

小白挑戰一周上架元服務——ArkUI04

文章目錄前言一、ArkUI是何方神圣&#xff1f;二、聲明式UI三、組件1.基礎組件2.布局容器組件3.導航組件4.自定義組件5.組件生命周期四、狀態管理1.State裝飾器: 狀態變量2.Prop裝飾器&#xff1a;父子單向同步3.Link裝飾器&#xff1a;父子雙向同步4.Provide/Consume裝飾器&am…

劇本殺小程序系統開發:構建劇本殺社交新生態

在社交需求日益多樣化的今天&#xff0c;劇本殺憑借其獨特的社交屬性&#xff0c;成為了人們熱衷的社交娛樂方式之一。而劇本殺小程序系統開發&#xff0c;則進一步拓展了劇本殺的社交邊界&#xff0c;構建起一個全新的劇本殺社交新生態&#xff0c;讓玩家在推理與角色扮演中&a…

AI提高投放效率的核心策略

內容概要人工智能技術正深刻改變著廣告投放領域&#xff0c;其核心價值在于顯著提升投放效率。通過融合智能算法優化、實時數據分析與自動化投放流程&#xff0c;AI系統能夠以前所未有的速度和精度處理海量信息&#xff0c;驅動更精準的營銷決策。這不僅大幅縮短了傳統人工操作…

OpenBMC 中命令模式的深度解析:從原理到實現

引言 在 OpenBMC 的設計中&#xff0c;命令模式&#xff08;Command Pattern&#xff09;被廣泛應用于各種場景&#xff0c;特別是 IPMI 命令處理、異步操作封裝和用戶請求管理等。本文將深入分析 OpenBMC 中命令模式的實現原理、架構設計以及完整的執行流程&#xff0c;并通過…

從0開始跟小甲魚C語言視頻使用linux一步步學習C語言(持續更新)8.15

第十七天 第五十七&#xff0c;五十八&#xff0c;五十九和六十集 第五十六集 刪除鏈表結點 沒什么好說的關鍵部分代碼如圖 鏈表的插入操作 依舊沒有啥可以說的代碼部分大家看視頻就能看懂&#xff0c;大家應該是沒有什么問題的吧&#xff1f; 第五十七集 共用體形式結構與結構…

云服務器網站無法訪問的系統化故障排查指南及多維度解決方案

當云服務器上的網站突然無法訪問時&#xff0c;這種突發狀況往往讓人措手不及。別擔心&#xff0c;我們可以通過系統化的排查流程快速定位問題根源。以下是經過實戰驗證的故障排除指南&#xff0c;幫您分步解決網站訪問異常問題。一、基礎狀態確認 服務器的生命體征就像人體的脈…

strings命令和findstr命令驗證iso文件中ntkrnlmp.exe系統版本

strings命令和findstr命令驗證iso文件中ntkrnlmp.exe系統版本D:\chsads3647\i386>expand.exe Microsoft (R) File Expansion Utility Version 5.2.3647.0 版本所有 (c) Microsoft Corporation. 保留所有權利。未指定文件。D:\chsads3647\i386>strings.exe ntkrnlmp.exe …

C語言:指針(5)

1. sizeof與strlen的對比1.1 sizeofsizeof屬于是操作符&#xff0c;用于計算變量所占的空間大小&#xff0c;單位為字節。如果操作數是類型的話&#xff0c;計算的是使用類型創建的變量所占內存空間的大小。sizeof只計算數據在內存中所占的空間大小&#xff0c;而不在乎內存中存…

rent8 安裝部署教程之 Windows

1. Apache 安裝與配置 1.1. 獲取并解壓 Apache 在 Apache Lounge 網址下載編譯版的 Apache。下載完成后&#xff0c;將壓縮包解壓到 d:\web\Apache24 作為 Apache 的安裝目錄。 1.2. 配置 Apache 打開配置文件 conf\httpd.conf&#xff0c;找到第 37 行配置。 ? Define SRVROO…

邊緣智能實戰手冊:攻克IoT應用三大挑戰的AI戰術

前言&#xff1a;在當前的AIoT&#xff08;人工智能物聯網&#xff09;賽道上&#xff0c;將AI能力下沉至邊緣設備已不再是“要不要做”的選擇題&#xff0c;而是“如何做好”的必答題。然而&#xff0c;在實際項目中&#xff0c;工程師們常常會遇到性能、功耗和隱私這“三座大…

【React】use-immer vs 原生 Hook:誰更勝一籌?

1.概述 use-immer 不屬于官方 Hook&#xff0c;是社區維護的第三方庫&#xff01;use-immer 通過封裝 Immer 的不可變更新機制&#xff0c;為 React 開發者提供了一種更直觀、高效的狀態管理方式。它尤其適合處理復雜嵌套狀態或需要頻繁更新的場景&#xff0c;同時保持了與 Re…

【案例】Vue3 實現高性能級橫向循環滾動生產線效果:基于 requestAnimationFrame 的流暢動畫方案

動畫效果在工業監控系統、生產看板等場景中&#xff0c;經常需要模擬生產線的動態運行效果。本文將基于 Vue3 和 requestAnimationFrame 實現一個高性能的橫向循環滾動效果&#xff0c;完美模擬生產線傳輸帶的視覺體驗。我們將從代碼實現到原理分析&#xff0c;全面講解如何打造…

萬字長文解碼如何玩轉Prompt(附實踐應用)

在AI技術迅猛發展的今天&#xff0c;如何與大型語言模型高效“對話”已成為釋放其潛力的關鍵。本文深入探討了提示詞工程&#xff08;Prompt Engineering&#xff09;這一新興領域&#xff0c;系統解析了從基礎概念到高級技巧的完整知識體系&#xff0c;并結合“淘寶XX業務數科…