Django中间件的应用
Posted guishuzhe
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django中间件的应用相关的知识,希望对你有一定的参考价值。
在Django中,中间件可以为我们对所有请求或一部分请求做批量处理
MIDDLEWARE = [ ‘django.middleware.security.SecurityMiddleware‘, ‘django.contrib.sessions.middleware.SessionMiddleware‘, ‘django.middleware.common.CommonMiddleware‘, ‘django.middleware.csrf.CsrfViewMiddleware‘, ‘django.contrib.auth.middleware.AuthenticationMiddleware‘, ‘django.contrib.messages.middleware.MessageMiddleware‘, ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘, ‘yangyu.middleware.auth.M1‘, # 自定义中间件,在settings.py中配置。执行的顺序则跟配置列表一样,响应则是倒着返回 ‘yangyu.middleware.auth.M2‘, ]
处理具体请求时的方法则分为5类
1.process_request(self,request) # 请求相关
2.process_view(self, request, callback, callback_args, callback_kwargs) # 视图相关
3.process_template_response(self,request,response) # 返回值中有render()方法
4.process_exception(self, request, exception) # 异常处理
5.process_response(self, request, response) # 响应相关
执行流程的分析
""" # 在请求到来时执行,如果有response则立即返回结果,不继续执行。没有则先执行完所有的process_request() 1.process_request(self,request) # 进入视图之前执行的操作,如果有response则立即返回结果,不继续执行。没有则先执行完所有的process_view() 2.process_view(self, request, callback, callback_args, callback_kwargs) # 返回值中有render()方法就执行,没有则不执行 # views 业务逻辑处理(视图函数) 3.process_template_response(self,request,response) # 执行过程中出现异常则进行异常处理,没有则不执行 4.process_exception(self, request, exception) # 响应相关,不管上面4步从哪一步返回,都会携带对应的process_response()给用户 5.process_response(self, request, response) """ from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class M1(MiddlewareMixin): def process_request(self,request): """ 根据settings列表的配置,决定执行顺序 :param request: :return: """ print(‘m1.process_request‘) def process_view(self, request, callback, callback_args, callback_kwargs): """ 如果视图出现批量需要处理的业务,则可以进行分压、分逻辑处理 :param request: :param callback: :param callback_args: :param callback_kwargs: :return: """ print(‘m1.process_view‘) # response = callback(request,*callback_args,**callback_kwargs) # return response def process_response(self,request,response): """ 不管是何执行结果,都会返回相应的HttpResonse对象 :param request: :param response: :return: """ print(‘m1.process_response‘) return response def process_exception(self, request, exception): """ 出现异常才会被调用进行异常处理 :param request: :param exception: :return: """ print(‘m1.process_exception‘) def process_template_response(self,request,response): """ 视图函数的返回值中,如果有render方法,才被调用 :param request: :param response: :return: """ print(‘m1.process_template_response‘) return response class M2(MiddlewareMixin): """ 在此处可以包含多个中间件的处理方法 """ def process_request(self,request): print(‘m2.process_request‘) def process_view(self, request, callback, callback_args, callback_kwargs): print(‘m2.process_view‘) def process_response(self,request,response): print(‘m2.process_response‘) return response def process_exception(self, request, exception): print(‘m2.process_exception‘) return HttpResponse(‘错误了...‘)
process_template_response()则还可以再次封装
from django.shortcuts import render class JSONResponse: """ process_template_response()方法,需要返回时执行render()方法, 这个特别之处可以让我们进行封装。 """ def __init__(self, req, status, msg): self.req = req self.status = status self.msg = msg def render(self): # 重写render()方法,返回json数据 import json ret = { ‘status‘: self.status, ‘msg‘:self.msg } return HttpResponse(json.dumps(ret)) def test(request): ret = {} # 调用封装的方法,传入数据 return JSONResponse(request, True, "错误信息")
Django中settings.py中字符串导入类的方法
在终端CMD中 mkdir auth cd auth 新建csrf.py文件 class CORS(object):pass # 根据字符串的形式,自动导入模块并使用反射找到模块中的类 path = r"C:Usersyangyauth.crsf.CORS" # importlib 模块支持传递字符串来导入模块 import importlib # 从右往左以.切割,分别获取路径和类名 module_path, class_name = path.rsplit(‘.‘,maxsplit=1) # 根据字符串的形式导入模块返回调用结果 m = importlib.import_module(module_path) # 反射获取调用的对象 cls = getattr(m,class_name) # 实例化对象 obj = cls() # 引用 obj.process_request()
以上是关于Django中间件的应用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django Summernote 中显示编程片段的代码块?
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段