django本來有是可以很方便自定義HTTP錯誤頁面的,網上資料一大把。核心是在項目的urls代碼中增加handler403的定義,比如:
handler403 = "app.views.your_custom_view"
404,500都是一樣的,重新定義handler404和handler500就行了。
但是我發現加上rest_framework之后,handler404和handler500都沒問題,就是handler403怎么都不行。后來看了rest_framework的文檔,才明白,rest_framework文檔寫的很明白,它會攔截PermissionDenied異常,所以自定義的handler403是不會起作用的。
我后來找到一種方法,自己寫一個middleware,攔截403錯誤。
1. 寫一個自定義的的middlewares.py:
from django.shortcuts import render from django.utils.deprecation import MiddlewareMixinclass CustomExceptionMiddleware(MiddlewareMixin):def process_response(self, request, response):if response.status_code == 500:error_message = f"error message: 500 server internal error"return render(request, 'error.html', {'error_message': error_message})elif response.status_code == 404:error_message = f"error message: 404 server internal error"return render(request, 'error.html', {'error_message': error_message})elif response.status_code == 403:error_message = f"error message: 403 server internal error"return render(request, 'error.html', {'error_message': error_message})else:return response
這里面對response進行攔截,如果status code是403則返回指定頁面,否則返回原來的response
2. 修改項目的settings,把剛寫的middleware加上去:
MIDDLEWARE = ['bid_request_system_app.commons.middlewares.CustomExceptionMiddleware' ]
就可以了