本文首發于公眾號:Hunter后端
原文鏈接:Django筆記三十一之全域例外處理
這一篇筆記介紹 Django 的全域例外處理,
當我們在處理一個 request 請求時,會盡可能的對介面資料的格式,內部呼叫的函式做一些例外處理,但可能還是會有一些意想不到的漏網之魚,造成程式的例外導致不能正常運行,甚至會直接報給前端一個錯誤,
為了避免這種情況的發生,令我們的后端服務看起來是正常的,就算有報錯也可以很體面的給前端一個提示,以及后端做一些錯誤日志的記錄,這里我們引入全域例外的處理,
這里我們會用 Django 的中間件和日志的處理來實作,在本系列文章的第二十九篇和第三十篇,可以先熟悉下這兩部分功能的使用,
在介紹中間件的章節,我們介紹了 __call__
() 和 process_view() 函式,其實還有一個 process_exception() 函式,這個函式就是當我們的請求在發生不可預知的報錯的情況下,會自動呼叫的函式,
我們來看這樣一個處理的示例:
# hunter/middlewares/exception_middleware.py
import traceback
from django.http import JsonResponse
import logging
logger = logging.getLogger(__name__)
class ExceptionMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response
def process_exception(self, request, exception):
traceback_info = traceback.format_exc()
logger.info(f"request_path: {request.path}, traceback_info: {traceback_info}")
return JsonResponse({"code": -1, "msg": "error"}, status=500)
在這里,我們使用 traceback.format_exc() 函式獲取到 exception 的報錯資訊,然后通過 logger 日志列印輸出,
日志資訊
這里我們主要輸出兩個資訊,一個是介面請求的路徑,request.path,一個是報錯資訊 traceback_info,當然,這里我們還可以記錄更多的資訊,比如請求的用戶資訊,請求的引數等,
記錄之后,后端就可以通過日志的具體資訊去查看到底是哪里出了問題,
回傳報錯
在這里,呼叫 process_exception() 函式之后,我們這里直接 return 了 response,還有一個 http 的狀態碼 status=500,這些資訊都是可以自己擬定的,到時候和前端約定好,檢測回傳了某個狀態碼比如 500,然后就友好的顯示某個報錯彈窗資訊,比如后臺正在處理報錯等,
呼叫中間件
定義好這個中間件之后,我們就需要在 settings.py 里去參考這個中間件,比如這個中間件我們放置的目錄是 hunter/middlewares/exception_middleware.py,就需要在 hunter/settings.py 的 MIDDLEWARE 末尾加上 'hunter.middlewares.exception_middleware.ExceptionMiddleware',
這一條,
# hunter/settings.py
MIDDLEWARE = [
...
'hunter.middlewares.exception_middleware.ExceptionMiddleware',
]
測驗報錯
我們去嘗試觸發報錯資訊,比如之前在 第二十九篇筆記中寫的一個介面,這里我們修改一下,直接報錯:
# blog/views.py
from django.http import HttpResponse, JsonResponse
def time_view(request):
html = "<h1>abc</h1>"
1 / 0
return HttpResponse(html)
然后在頁面或者 postman 里呼叫該介面,就可以在 logger 指定的日志檔案里看到關于這一行的具體報錯資訊啦,
以上就是本篇筆記的全部內容,接下來我會接著介紹一下 Django 里 session 的一個簡單應用,也就是說如何判斷用戶是否登錄的一個示例,
如果想獲取更多后端相關文章,可掃碼關注閱讀:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/551287.html
標籤:其他
上一篇:elastic-job原始碼(1)- job自動裝配
下一篇:返回列表