环境
- Win10
- Python3.6.6
- Django2.1.3
中间件作用
中间件用于全局修改 Django 的输入或输出.
中间件常见用途
缓存
会话认证
日志记录
异常
中间件执行流程
image
全局异常捕捉实现
创建 django 项目 & 添加 App
- django-admin startproject middleware
- cd middleware
- django-admin startapp App
添加 App 到项目
- # middleware/settings.py
- # INSTALLED_APPS 最后添加 App
- INSTALLED_APPS = [
- 'app',
- ]
编辑中间件并添加到项目
注: 中间件注册访问有一定的关联性, 位置不可以随意放
- # 创建 App/middleware.py 并编辑
- from django.http import JsonResponse
- class CustomMiddleware:
- def __init__(self, get_response):
- print("程序启动时执行, 只执行一次")
- self.get_response = get_response
- def __call__(self, request):
- print("中间件开始")
- response = self.get_response(request)
- print("中间件结束")
- return response
- def process_view(self, request, view_func, view_args, view_kwargs):
- print("请求实际函数前执行")
- def process_exception(self, request, exception):
- print("程序异常时执行")
- return JsonResponse({"msg": exception.args[0], "code": -1})
编辑 middleware.setttings.py
- MIDDLEWARE = [
- ...
- 'app.middleware.CustomMiddleware'
- ]
编写一个异常
- # App/views.py
- from django.http import JsonResponse
- def json_response(request):
- print('json_response')
- err = 3 / 0
- return JsonResponse({"msg": "ok", "code": 0})
添加到路由
- # middleware/urls.py
- from App.views import json_response, view_response
- urlpatterns = [
- ...
- path("view", view_response)
- ]
运行测试
访问: http://127.0.0.1:8000/json/
结果
image
另一个觉用途日志记录
- # 在中间件函数 process_view 中添加
- print("path: {}; method: {}; data: {}".format(request.get_full_path(), request.method, request.body or ''))
参考:
来源: http://www.jianshu.com/p/0b35e71a8483