反正感觉有点复杂 硬着头皮吧!!!
中间件函数是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.在对应的应用中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
中注册中间件类
结果图:一样能够达到相同的效果
在类中定义中间件预留函数:
__init__
:服务器响应第一个请求的时候调用。
process_request
:是在产生request对象,进行url匹配之前调用。
process_view
:是url匹配之后,调用视图函数之前。
process_response
:视图函数调用之后,内容返回给浏览器之前。
process_exception
:视图函数出现异常,会调用这个函数。
如果注册的多个中间件类中包含process_exception
函数的时候,调用的顺序跟注册的顺序是相反的。
这些预留函数,我们刚才定义只定义过process_view
,由于我们return HttpResponse('Forbidden')
,也就像上面的流程图一样,直接跳到了process_response
,从而不会去调用view
函数,这里也就说明了中间件中的流程是可以干扰/跳过的。
这些大家自己可以去查阅下资料,如果自己有时间再补上。