一、中间件
介绍
在 Django 中,中间件(Middleware)是一组轻量级、底层的插件系统,用于全局地改变 Django 的输入和输出。中间件可以在请求被处理之前和响应返回之前执行代码,从而实现各种功能,例如跨域资源共享(CORS)、用户认证、日志记录等。
激活中间件
若要激活中间件,需要添加到settings.MIDDLEWARE中
- 每个中间件组件由字符串表示:指向中间件工厂类的完整 Python 路径。
- 需求注意中间件的添加顺序。因为中间件有执行顺序,而且中间件之间可能有依赖关系。
- 中间件的全局执行顺序
- 请求阶段:按settings.MIDDLEWARE中从上到下的顺序执行。
- 视图处理:请求到达视图函数。
- 响应阶段:按settings.MIDDLEWARE中从下到上的顺序执行。
- MIDDLEWARE = [
- "corsheaders.middleware.CorsMiddleware", # CORS跨域支持
- "django.middleware.security.SecurityMiddleware",
- "django.contrib.sessions.middleware.SessionMiddleware",
- "django.middleware.locale.LocaleMiddleware", # I18N多语言支持,注意放置顺序
- "django.middleware.common.CommonMiddleware",
- "django.middleware.csrf.CsrfViewMiddleware",
- "django.contrib.auth.middleware.AuthenticationMiddleware",
- "django.contrib.messages.middleware.MessageMiddleware",
- "django.middleware.clickjacking.XFrameOptionsMiddleware",
- # "myapp_system.operate_log.services.OperateLogMiddleware", # 操作日志开关:如果数据库磁盘IO性能一般,建议关闭
- ]
复制代码 生命周期
中间件生命周期
- 请求阶段:process_request(request):在视图函数被调用之前执行,用于处理请求。如果返回 HttpResponse 对象,则后续的中间件和视图不会被调用,直接返回响应。
- 视图阶段:process_view(request, view_func, view_args, view_kwargs):在视图函数被调用之前执行,可以用于根据视图函数的参数或请求信息进行额外处理。
- 响应阶段:process_response(request, response):在视图函数返回响应后执行,用于处理响应对象,可以修改响应内容或响应头。
- 异常阶段:process_exception(request, exception):当视图函数抛出异常时执行,用于处理异常并返回一个 HttpResponse 对象。
内置中间件示例
- django.contrib.auth.middleware.AuthenticationMiddleware:Django内置的认证中间件,实现将 user 属性添加到每个传入的 HttpRequest 对象中,表示当前已登录的用户
- class AuthenticationMiddleware(MiddlewareMixin):
- def process_request(self, request):
- if not hasattr(request, "session"):
- raise ImproperlyConfigured(
- "The Django authentication middleware requires session "
- "middleware to be installed. Edit your MIDDLEWARE setting to "
- "insert "
- "'django.contrib.sessions.middleware.SessionMiddleware' before "
- "'django.contrib.auth.middleware.AuthenticationMiddleware'."
- )
- request.user = SimpleLazyObject(lambda: get_user(request))
复制代码 二、自定义中间件
中间件钩子函数
process_view()中间件钩子函数
- 语法:process_view(request, view_func, view_args, view_kwargs)
- 调用顺序:process_view() 只在 Django 调用视图前被调用。
- 返回
- 如果它返回 None ,Django 将继续处理这个请求,执行任何其他的 process_view() ,然后执行相应的视图。
- 如果它返回 HttpResponse 对象,Django 不会去影响调用相应的视图;它会将响应中间件应用到 HttpResponse 并返回结果。
基于类的中间件
基于类的自定义中间件格式
- 语句response = self.get_response(request),将__call__()方法中的代码分为两部分
- class SimpleMiddleware:
- def __init__(self, get_response):
- # 执行一次性配置和初始化工作
- self.get_response = get_response
- def __call__(self, request):
- # 每个请求调用一次,在视图函数被调用之前执行
- response = self.get_response(request)
- # 每个请求调用一次,在视图函数被调用之后执行
- return response
复制代码 三、实战案例
操作日志功能
通过自定义中间件,实现Django操作日志记录功能
- 第1步:定义类OperateLogMiddleware,方法__init__()中,添加exclude_urls排除不需要记录的URL的列表,和一个字典log_data用于临时存放日志信息。
- 第2步:在执行视图函数之前,向字典log_data记录请求方法、请求路径、操作IP、浏览器Agent信息等
- 第3步:在执行视图函数之后,向字典log_data记录用户ID、业务状态码、HTTP状态码、响应数据、返回结果和执行时间
- 第4步:process_view()中间件钩子函数中,向字典log_data记录视图名称、Action名称、资源ID
第5步:字典log_data记录的操作日志信息,通过Celery异步任务,写入数据库。实现操作日志记录功能。
代码运行效果:
查看完整代码:下载地址
参考资料
您正在阅读的是《Django从入门到实战》专栏!关注不迷路~
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |