關(guān)于Python中Flask全局異常處理流程詳解
前言
關(guān)于客戶端/服務(wù)端異常,先看段樣例代碼:
from flask import * from paddlenlp import Taskflow from werkzeug.exceptions import HTTPException app = Flask(__name__) app.config['JSON_AS_ASCII'] = False @app.errorhandler(Exception) def handle_500_exception(e): # pass through HTTP errors if isinstance(e, HTTPException): return e # now you're handling non-HTTP exceptions only return render_template("500_generic.html", e=e), 500 @app.errorhandler(HTTPException) def handle_exception(e): response = e.get_response() response.data = json.dumps({ "code": e.code, "name": e.name, "description": e.description, }) response.content_type = "application/json" return response class RequestParamException(HTTPException): code = 400 def handle_param_exception(e): response = e.get_response() response.data = json.dumps({ "code": e.code, "name": "子類:RequestParamException 處理的異常。", "description": e.description, }) response.content_type = "application/json" return response @app.route('/add_user', methods=['POST']) def add_documents(): data = request.get_json() user = data['user'] if user is None or len(user) <= 0: raise RequestParamException(description="user 不能為 None 或 ''。") return {"user": user}, 201 if __name__ == '__main__': app.register_error_handler(RequestParamException, handle_param_exception) app.run(debug=True)
一、Flask是什么?
Flask是一個(gè)基于Python的Web框架,它提供了全局異常處理的機(jī)制來捕獲和處理應(yīng)用程序中的異常。下面將詳細(xì)介紹ask的全局異常處理、裝飾器模式、工廠模式、assert觸發(fā)異常、raise觸發(fā)異常、abort觸發(fā)異常以及異常處理的正常請(qǐng)求、異常請(qǐng)求、客戶端異常和服務(wù)器異常,并提供相應(yīng)的代碼示例。
二、Flask異常處理的整體流
1.異常注冊(cè)
在Flask應(yīng)用程序中,通過@app.errorhandler裝飾器將異常類型與處理函數(shù)綁定。這樣做的目的是在應(yīng)用程序運(yùn)行過程中捕獲特定類型的異常,并進(jìn)行適當(dāng)?shù)奶幚???梢詾椴煌腍TTP狀態(tài)碼或其他異常類型注冊(cè)相應(yīng)的處理函數(shù)。
from flask import Flask app = Flask(__name__) @app.errorhandler(404) def handle_not_found_error(error): return "Page not found", 404 @app.errorhandler(Exception) def handle_generic_error(error): return "Internal Server Error", 500 if __name__ == '__main__': app.run()
在上述代碼中,使用@app.errorhandler(404)裝飾器將handle_not_found_error函數(shù)與404錯(cuò)誤綁定,而handle_generic_error則是注冊(cè)的通用異常處理函數(shù)。
2.異常觸發(fā)
當(dāng)應(yīng)用程序中發(fā)生異常時(shí),F(xiàn)lask會(huì)根據(jù)異常類型自動(dòng)觸發(fā)相應(yīng)的異常。異常的觸發(fā)可以有多種方式,例如路由函數(shù)中拋出異常、使用abort函數(shù)手動(dòng)引發(fā)HTTP異常等。
from flask import Flask, abort app = Flask(__name__) @app.route('/') def index(): # 觸發(fā)異常方式一:拋出異常 raise ValueError("Something went wrong") @app.route('/users/<int:user_id>') def get_user__': app.run()
assert觸發(fā)異常: 在Python中,使用assert語句可以檢查某個(gè)條件是否為真,如果條件為假,則會(huì)觸發(fā)AssertionError異常。在Flask中,可以利用assert語句進(jìn)行請(qǐng)求參數(shù)的校驗(yàn)。
raise觸發(fā)異常: 在Python中,使用raise語句可以顯式地觸發(fā)特定的異常。在Flask應(yīng)用程序中,我們可以根據(jù)需要觸發(fā)不同類型的異常來處理業(yè)務(wù)邏輯。
abort觸發(fā)異常: 在Flask中,可以使用abort函數(shù)手動(dòng)觸發(fā)HTTP錯(cuò)誤。abort函數(shù)默認(rèn)觸發(fā)一個(gè)HTTPException異常。
3.異常處理
當(dāng)異常被觸發(fā)后,F(xiàn)lask會(huì)尋找與該異常類型對(duì)應(yīng)的注冊(cè)處理函數(shù),并將控制權(quán)轉(zhuǎn)移到相應(yīng)的處理函數(shù)。在異常處理函數(shù)中,可以根據(jù)需要進(jìn)行自定義的異常信息返回、日志記錄或其他操作。
from flask import Flask, jsonify app = Flask(__name__) @app.errorhandler(404) def handle_not_found_error(error): return jsonify({"message": "Page not found"}), 404 @app.errorhandler(Exception) def handle_generic_error(error): app.logger.error("An error occurred: %s", error) return jsonify({"message": "Internal Server Error"}), 500 if __name__ == '__main__': app.run()
異常處理函數(shù)中,handle_not_found_error處理404錯(cuò)誤并返回自定義的JSON響應(yīng)。而handle_generic_error則是通用的異常處理函數(shù),在發(fā)生任何未捕獲的異常時(shí)都會(huì)調(diào)用,它記錄了錯(cuò)誤日志并返回適當(dāng)?shù)腻e(cuò)誤響應(yīng)。
三、客戶端異常和服務(wù)端異常
客戶端異常是由于客戶端錯(cuò)誤導(dǎo)致的異常,例如無效的請(qǐng)求、身份驗(yàn)證失敗等。服務(wù)器異常則是由于服務(wù)器錯(cuò)誤導(dǎo)致的異常,如應(yīng)用程序崩潰、數(shù)據(jù)庫連接問題等。
1.客戶端異常
客戶端異常是由客戶端的無效請(qǐng)求或操作引起的。對(duì)于客戶端異常,應(yīng)注意以下事項(xiàng):
適當(dāng)?shù)腍TTP狀態(tài)碼:返回正確的HTTP狀態(tài)碼來表示客戶端錯(cuò)誤。常見的狀態(tài)碼包括400(錯(cuò)誤請(qǐng)求)、401(未授權(quán))、403(禁止訪問)等。
from flask import Flask, jsonify app = Flask(__name__) @app.route('/login', methods=['POST']) def login(): username = request.form.get('username') password = request.form.get('password') if not username or not password: # 返回400錯(cuò)誤狀態(tài)碼和錯(cuò)誤信息 return jsonify({"error": "Invalid username or password"}), 400 # 進(jìn)行身份驗(yàn)證邏輯... if __name__ == '__main__': app.run()
在上述代碼中,如果缺少用戶名或密碼,服務(wù)器將返回400錯(cuò)誤狀態(tài)碼和錯(cuò)誤信息。
錯(cuò)誤處理裝飾器:可以使用裝飾器捕獲客戶端異常,并返回適當(dāng)?shù)捻憫?yīng)。例如,使用@app.errorhandler(400)裝飾器來捕獲400錯(cuò)誤。
from flask import Flask, jsonify app = Flask(_name_) @app.errorhandler(400) def handle_bad_request_error(error): return jsonify({"error": "Bad Request"}), 400 @app.route('/login', methods=['POST']) def login(): username = request.form.get('username') password = request.form.get('password') if not username or not password: # 返回400錯(cuò)誤狀態(tài)碼,裝飾器的處理函數(shù)會(huì)被觸發(fā) abort(400) # 進(jìn)行身份驗(yàn)證邏輯... if __name__ == '__main__': app.run()
如果缺少用戶名或密碼,在login函數(shù)中使用abort(400)觸發(fā)400錯(cuò)誤,然后由handle_bad_request_error處理該錯(cuò)誤并返回自定義的錯(cuò)誤響應(yīng)。
2.服務(wù)器異常
服務(wù)器異常是由于服務(wù)器端錯(cuò)誤導(dǎo)致的異常。對(duì)于服務(wù)器異常,需要注意以下事項(xiàng):
2.1 錯(cuò)誤日志記錄
在發(fā)生服務(wù)器異常時(shí),及時(shí)記錄錯(cuò)誤信息到日志文件中,以便進(jìn)行故障排查和問題修復(fù)。
import logging from flask import Flask app = Flask(__name__) @app.route('/') def index(): try: # 一些潛在的引發(fā)異常的操作 raise ValueError("Something went wrong") except Exception as e app.logger.error("An error occurred: %s", str(e)) # 返回通用的服務(wù)器錯(cuò)誤響應(yīng) return "Internal Server Error", 500 if __name__ == '__main app.run()
當(dāng)發(fā)生異常app.logger.error將錯(cuò)誤信息記錄到應(yīng)用程序的日志中。
2.2 通用的錯(cuò)誤處理
捕獲和處理未處理的服務(wù)器異常,并返回適當(dāng)?shù)腻e(cuò)誤響應(yīng)給客戶端。
from flask import Flask, jsonify app = Flask(__name__) @app.errorhandler(Exception) def handle_generic_error(error): app.logger.error("An error occurred: %s", error) # 返回自定義的服務(wù)器錯(cuò)誤響應(yīng) return jsonify({"error": "Internal Server Error"}), 500 @app.route('/') def index(): try: # 一些潛在的引發(fā)異常的操作 raise ValueError("Something went wrong") except Exception as: # 觸發(fā)異常后由異常處理函數(shù)進(jìn)行處理 return handle_generic_error(e) if __name__ == '__main__': app.run()
當(dāng)發(fā)生異常時(shí),調(diào)用handle_generic_error進(jìn)行處理并返回自定義的服務(wù)器錯(cuò)誤響應(yīng)。例模式可將處理邏輯從路由函數(shù)中分離出來。
總結(jié)
1、注冊(cè)處理函數(shù),將特定類型的異常與相應(yīng)的處理函數(shù)綁定。
2、在應(yīng)用程序執(zhí)行過程中,如果發(fā)生異常,F(xiàn)lask會(huì)尋找匹配的異常處理函數(shù)。
3、匹配到異常處理函數(shù)后,控制權(quán)轉(zhuǎn)移到異常處理函數(shù),并執(zhí)行相4、應(yīng)的處理邏輯。
5、異常處理函數(shù)可以根據(jù)需要進(jìn)行自定義的異常信息返回、日志記錄或其他操作。
6、處理完異常后,F(xiàn)lask會(huì)返回相應(yīng)的錯(cuò)誤響應(yīng)給客戶端。
到此這篇關(guān)于關(guān)于Python中Flask全局異常處理流程詳解的文章就介紹到這了,更多相關(guān)Python Flask全局異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python腳本實(shí)現(xiàn)調(diào)用手機(jī)攝像頭
這篇文章主要為大家詳細(xì)介紹了Python如何通過,腳本實(shí)現(xiàn)調(diào)用手機(jī)攝像頭,這樣就能隨時(shí)隨地用電腦偷偷看看男朋友都在干啥了,感興趣的小伙伴可以了解下2025-03-03基于Pyinstaller打包Python程序并壓縮文件大小
這篇文章主要介紹了基于Pyinstaller打包Python程序并壓縮文件大小,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05不到20行代碼用Python做一個(gè)智能聊天機(jī)器人
小編先向大家介紹一下本次運(yùn)用到的python庫,本次項(xiàng)目主要運(yùn)用到的庫有wxpy和chatterbot。對(duì)Python做一個(gè)智能聊天機(jī)器人的相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2019-04-04使用Python設(shè)置tmpfs來加速項(xiàng)目的教程
這篇文章主要介紹了使用Python設(shè)置tmpfs來加速項(xiàng)目的教程,文中給出方法使用Python腳本將tmpfs保存于內(nèi)存中的程序存儲(chǔ)到本地硬盤上,需要的朋友可以參考下2015-04-04解讀MaxPooling1D和GlobalMaxPooling1D的區(qū)別
這篇文章主要介紹了MaxPooling1D和GlobalMaxPooling1D的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12numpy判斷數(shù)值類型、過濾出數(shù)值型數(shù)據(jù)的方法
今天小編就為大家分享一篇numpy判斷數(shù)值類型、過濾出數(shù)值型數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06使用python實(shí)現(xiàn)回文數(shù)的四種方法小結(jié)
今天小編就為大家分享一篇使用python實(shí)現(xiàn)回文數(shù)的四種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11