美文网首页django
Django 框架之 中间件

Django 框架之 中间件

作者: Spareribs | 来源:发表于2016-12-21 22:37 被阅读953次

    知识点

    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 框架之 中间件

        本文链接:https://www.haomeiwen.com/subject/pbhcvttx.html