Django 框架之 中间件

知识点

  1. 概念
  2. 使用场景
  3. 中间件如何发生作用
  4. 自定义中间件

中间件概念

中间件是嵌入 django 的 request/response 处理过程的一套钩子框架。它是一个轻量级的底层嵌入系统,可以对 django 的输入输出做整体的修改。

使用场景

如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。
可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。
比如我们写一个判断浏览器来源,是pc还是手机,这里手机我们采用iphone,因为暂时没有其他设备。我们有不想把这个逻辑加到视图函数里,想作为一个通用服务,作为一个可插拔的组件被使用,最好的方法就是实现为中间件。

中间件作用流程

Django中间件必须是一个类,不需要继承任何类,并实现四个接口:

  1. process_request(self, request)该方法在请求到来的时候调用。
  2. process_view(self ,request, fnc , arg ,kwarg)在本次将要执行的View函数被调用前调用本函数。
  3. process_response(self,request,response)在执行完View函数准备将响应发到客户端前被执行。
  4. process_exception(self,request, exception). View函数在抛出异常时该函数被调用,得到的exception参数是实际上抛出的异常实例。通过此方法可以进行很好的错误控制,提供友好的用户界面。

中间件如何发生作用

要激活中间件,需要把它添加到Django 配置文件中的MIDDLEWARE_CLASSES 元组中。

参考文档

代码地址:Spareibs的Github

实验操作

获取当前访问的客户端系统信息

【middleware.py】

class CheckSoureMiddware(object):
    def process_request(self, request):
        from_source = request.META['HTTP_USER_AGENT']
        print('from_source ',from_source)
        if 'iPhone' in from_source:
            request.session['from_source'] = 'iphone'
        else:
            request.session['from_source'] = 'pc'

    def process_response(self, request, response):
        res = 'hehe'
        print(res)
        return HttpResponse(res)

【views.py】

from django.shortcuts import render,HttpResponse

# Create your views here.
def index(request):
    res = 'hi, friend! where a u from?'
    from_source = request.session.get('from_source', 'unkown')
    res = 'hi, friend! u come from %s' %from_source
    return HttpResponse(res)

【settings.py】

MIDDLEWARE_CLASSES = [
    'example.middleware.CheckSoureMiddware',
]

获取当前访问的客户端的IP

【middleware.py】

from django.http import HttpResponse

class ForbidSomeIpMiddleware(object):
    def process_request(self, request):
        allow_ip = ['127.0.0.1',]
        ip = request.META['REMOTE_ADDR']
        print('ip ', ip)
        if ip in allow_ip:
            print('ip not allowed')
            return HttpResponse('ip not allowed')

    def process_response(self, request, response):
        res = 'haha'
        print(res)
        return HttpResponse(res)

【settings.py】

MIDDLEWARE_CLASSES = [
    'example.middleware.ForbidSomeIpMiddleware',
]

结论

先注册的中间件先被调用(可以使用process_response来查看)

你可能感兴趣的:(Django 框架之 中间件)