Django-中间件Middleware

Django-中间件

  • Djano中间件流程
    • django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。请求过来,先经过所有的process_request(),到视图函数后,经过所有的process_response返回。
    • 但是如果中某一个process_request()有了返回值,找到它自己所对应的process_respons()直接返回。
    • 1.10版本之后都是这样的流程,之前的版本,如果process_request()有了返回值,会到最后一个process_respons(),然后返回 。

5个方法

  • process_request()、process_response()
# md.py

from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
    def process_request(self,request):
        print('m1.process_request')
    def process_response(self,request,response):
        print('m1.process_response')
        return response

class M2(MiddlewareMixin):
    def process_request(self, request):
        print('m2.process_request')
    def process_response(self, request, response):
        print('m2.process_response')
        return response

# setting.py


MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    ..........
    'md.M1',
    'md.M2',
]


# views.py

def test(request):
    print('ok')
    return HttpResponse('ok')


# 输出结果

m1.process_request
m2.process_request
ok
m2.process_response
m1.process_response

  • process_view()
# md.py

from django.utils.deprecation import MiddlewareMixin

class M1(MiddlewareMixin):
    def process_request(self,request):
        print('m1.process_request')
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('m1.process_view')
    def process_response(self,request,response):
        print('m1.process_response')
        return response


class M2(MiddlewareMixin):
    def process_request(self, request):
        print('m2.process_request')
    def process_response(self, request, response):
        print('m2.process_response')
        return response

# 输出结果
m1.process_request
m2.process_request
m1.process_view
ok
m2.process_response
m1.process_response
# md.py
from django.utils.deprecation import MiddlewareMixin

class M1(MiddlewareMixin):
    def process_request(self,request):
        print('m1.process_request')
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('m1.process_view')
    def process_response(self,request,response):
        print('m1.process_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
# 输出结果
m1.process_request
m2.process_request
m1.process_view
m2.process_view
ok
m2.process_response
m1.process_response

# md.py
from django.utils.deprecation import MiddlewareMixin

class M1(MiddlewareMixin):
    def process_request(self,request):
        print('m1.process_request')
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('m1.process_view')
        response = callback(request,*callback_args, **callback_kwargs)
        return response
    def process_response(self,request,response):
        print('m1.process_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
# 输出结果
m1.process_request
m2.process_request
m1.process_view
ok
m2.process_response
m1.process_response

  • process_exception()
# views.py 在视图函数中添加错误进行测试

def test(request):

    print('ok')
    int('test')
    return HttpResponse('ok')

# md.py
from django.utils.deprecation import MiddlewareMixin

class M1(MiddlewareMixin):
    def process_request(self,request):
        print('m1.process_request')
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('m1.process_view')
        # response = callback(request,*callback_args, **callback_kwargs)
        # return response
    def process_response(self,request,response):
        print('m1.process_response')
        return response
    def process_exception(self, request, exception):
        print('m1.process_exception')


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')
# 输出结果
m1.process_request
m2.process_request
m1.process_view
m2.process_view
ok
m2.process_exception
m1.process_exception
m2.process_response
m1.process_response

应用

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class M1(MiddlewareMixin):
    def process_request(self,request):
        print('m1.process_request')
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('m1.process_view')
        # response = callback(request,*callback_args, **callback_kwargs)
        # return response
    def process_response(self,request,response):
        print('m1.process_response')
        return response
    def process_exception(self, request, exception):
        print('m1.process_exception')


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('有错误!')


# 不会报错

# 输出结果
m1.process_request
m2.process_request
m1.process_view
m2.process_view
ok
m2.process_exception
m2.process_response
m1.process_response

  • process_template_response()
# 对视图函数的返回值有一定的要求,在函数返回值中有render方法才执行。

# views.py
from django.shortcuts import render,redirect,HttpResponse

# Create your views here.

class JsonResponse:
    def __init__(self,req,status,msg):
        self.req = req
        self.status = status
        self.msg = msg
    def render(self):
        import json
        ret = {
            'status': self.status,
            'msg': self.msg

        }
        return HttpResponse(json.dumps(ret))

def test(request):

    return JsonResponse(request,True,'错误信息!')

# md.py
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class M1(MiddlewareMixin):
    def process_request(self,request):
        print('m1.process_request')
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('m1.process_view')
        # response = callback(request,*callback_args, **callback_kwargs)
        # return response
    def process_response(self,request,response):
        print('m1.process_response')
        return response
    def process_exception(self, request, exception):
        print('m1.process_exception')
    def process_template_response(self,request,response):
        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('有错误!')


# 输出结果

m1.process_request
m2.process_request
m1.process_view
m2.process_view
m1.process_template_response
m2.process_response
m1.process_response
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值