django 中间件

反正感觉有点复杂 硬着头皮吧!!!

中间件函数django框架给我们预留的函数接口,让我们可以干预请求和应答的过程。

想要实现的需求:指定某个ip无法访问自己搭建的站点

使用request对象的META属性:request.META['REMOTE_ADDR']

通过装饰器去实现:

Block_ip_lists = ['172.30.212.210']


def to_block(func):
    def wrapper(request, *args, **kwargs):
        ip = request.META['REMOTE_ADDR']
        print(ip)
        if ip in Block_ip_lists:
            return HttpResponse('Forbidden')
        else:
            return func(request, *args, **kwargs)
    return wrapper

效果图:

django 中间件_第1张图片

但是装饰器的话 也会发现一个问题,如果所有的视图函数都需要,岂不是太麻烦了???

解决:使用django的中间件类

请求过程图如下:

django 中间件_第2张图片
1.在对应的应用中booktest中创建一个middleware的文件,定义一个中间件类,代码如下:

from django.http import HttpResponse


class BlockIpMiddleware(object):
    Block_ip_lists = ['172.30.213.228']
    
    def process_view(self, request, func, *args, **kwargs):
        ip = request.META['REMOTE_ADDR']
        if ip in BlockIpMiddleware.Block_ip_lists:
            return HttpResponse('Forbidden')

2.在settings.py中注册中间件类
django 中间件_第3张图片
结果图:一样能够达到相同的效果
django 中间件_第4张图片

在类中定义中间件预留函数:

__init__:服务器响应第一个请求的时候调用。

process_request:是在产生request对象,进行url匹配之前调用。

process_view:是url匹配之后,调用视图函数之前。

process_response:视图函数调用之后,内容返回给浏览器之前。

process_exception:视图函数出现异常,会调用这个函数。

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

这些预留函数,我们刚才定义只定义过process_view ,由于我们return HttpResponse('Forbidden'),也就像上面的流程图一样,直接跳到了process_response,从而不会去调用view函数,这里也就说明了中间件中的流程是可以干扰/跳过的。

这些大家自己可以去查阅下资料,如果自己有时间再补上。

你可能感兴趣的:(python,django)