Django中间件

背景

  • 获取用户访问的地址信息

    1
    2
    # 通过request的META属性获取,里面有一个REMOTE_ADDR
    addr = requesst.META['REMOTE_ADDR']
  • 中间件的作用

    中间件是程序在使用视图前调用的方法,借用这个我们可以介入用户请求和处理的内部

使用中间件

  1. 在对应应用的下面新建一个中间件文件【middleware.py】,名字可以自己定,但一般都叫这个

    1
    touch middleware.py
  2. 编辑中间件【middleware.py】的内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    # 设置屏蔽用户的IP

    from django.http import HttpResponse
    # 需要继承MiddlewareMixin, 不然会报错
    from django.utils.deprecation import MiddlewareMixin

    # 切记中间件的函数名称就叫process_view,断不可改
    class BlockedIPMiddleware(MiddlewareMixin):

    blockip=['192.168.0.115']

    def __init__(self, get_response):
    '''服务器重启后,接受到第一个request时调用的方法
    get_response:必须要添加的参数,不知原因
    '''
    # self.get_response:一定要加上,原因不明
    self.get_response = get_response
    print("---init---")

    def process_request(self, request):
    '''服务器生成request对象后,未匹配url之前执行,request参数表示生成的request对象'''
    print('----process-request---')

    def process_view(self, request, view_func, *view_args, **view_kwargs):
    '''视图函数调用之前会调用process_view方法
    request:服务器生成的request对象
    view_func:将要调用的视图函数
    *view_args:url中匹配的位置参数
    **view_kwargs:url中匹配的关键字参数
    '''
    ip = request.META['REMOTE_ADDR']
    print(ip)
    if ip in BlockedIPMiddleware.blockip:
    return HttpResponse('forbiden')

    def process_response(self, request, response):
    '''视图函数调用完毕生成响应内容后,准备将相应内容发送给浏览器之前进行执行
    request:表示服务器生成的request对象
    response:表示视图函数返回的响应内容对象
    '''
    print('----response----')
    # 该函数必须要返回一个响应内容
    return response

    def process_exception(self, request, exception):
    '''视图函数调用出现问题后,会执行的函数
    request:表示服务器生成的request对象
    exception:表示视图函数执行的时候产生的异常信息
    '''
    print('----exception----')

    django提供的中间件接口函数如下:

    • 任意一个函数只要返回的HttpResponse对象,则后面的过程就直接跳过
    • 需要用到什么函数,就写哪个函数
    函数名 作用
    __init__ 服务器重启后,接受到第一个请求的时候调用
    process_request 产生request对象,进行url匹配之前进行调用
    process_view url匹配之后调用视图函数之前进行调用
    process_response 视图函数调用之后,内容返回给浏览器之前进行调用
    process_exception 视图函数异常的时候,会调用该函数

    注意:如果注册的多个中间件间类中包含process_exception函数的时候,调用的顺序与注册的顺序是相反的

  3. 修改项目配置文件【settings.py】文件,将自定义的中间件文件注册到配置文件中

    1
    2
    3
    4
    MIDDLEWARE = [
    # 依次对应的是【应用名.中间件文件名.Class名】
    'wuxiang.middleware.BlockedIPMiddleware'
    ]