中间件 | Django开发
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中间件 | Django开发相关的知识,希望对你有一定的参考价值。
1.中间件(类,里面放了不同的函数) # 中间键是一个轻量级,底层的插件系统,介入Django的请求和响应的处理过程,修改Djang输入输出; 1.1 中间件的引入 # 禁止ip访问 1.在视图中定义一个函数禁止某个用户访问当前ip def index3(request): # 获取远程用户的IP地址 remote_addr = request.META[‘REMOTE_ADDR‘] # 禁止访问IP forbidden_addr = [‘192.168.**.***‘] # 判断访问ip是否为禁止ip if remote_addr in forbidden_addr: return HttpResponse(‘<h1>就是不让你访问!</h1>) return render(request, ‘other/index3.html‘, locals()) >>>>>> 这里就引出一个问题,只有当前视图的页面不被访问 >>>>>> 那怎么解决呢?每个视图上都加上这个函数? >>>>>> 这个时候就引出了中间键,在访问视图之前就对用户访问做限制; 2.使用中间件禁止ip访问 1.在应用中新建一个py文件,middleware.py,在里面定义一个类 class ForbiddenIpsMiddleware(object): # 在匹配视图之前调用 def process_request(self, request): # 获取远程用户的IP地址 remote_addr = request.META[‘REMOTE_ADDR‘] # 禁止访问ip forbidden_addr = [‘192.168.**.***‘] # 判断访问ip是否为禁止ip if remote_addr in forbidden_addr: return HttpReponse(‘<h1>就是不让你访问!</h1>‘) 2.在settings.py配置于文件中,将这个类写入中间键位置,就会在视图执行之前自动调用 MIDDLEWARE_CLASSES = [ ... ‘other.middleware.ForbiddenIpsMiddleware‘, ] 1.2 内置函数 process_request(request):在处理请求(匹配视图前)前调用 process_view(reqeust,view_func,view _args,view_kwargs):在处理视图之前调用 __init__(get_response):初始化,无需参数,服务器响应第一个请求的时候调用,确定是否启用当前中间件; process_response(request,response):所有响应返回浏览器之前被调用 process_exception(request,exception):视图抛出异常时调用 1.3 中间件方法执行顺序 # 在middleware.py定义类,并注册在settings.py中 # 按需编写中间件 class MyMiddleware(object): # 第一个请求的时候调用,之后的请求不再调用 def __init__(self): print(‘MyMiddleware __init__!‘) # urlconf执行之前调用 def process_request(self, request): print(‘MyMiddleware process_request!‘) # urlconf匹配到之后,视图函数执行之前调用 def process_view(self, request, view_func, *args, **kwargs) print(‘MyMiddleware process_view!‘) # 在执行视图之前,进行干预 # return HttpReponse(‘<h1>process_view函数返回的结果!</h1>‘) # 视图函数执行之后调用 def process_response(self, request, response): print(‘MyMiddleware process_response!‘) return response # 修改视图返回结果 # return HttpResponse(‘process_response修改了视图返回结果!‘) 1.4 中间件:异常处理 # 在middleware.py定义类,并注册在settings.py中 class MyExceptionMiddleware(object): def process_exception(self,request,exception): # 将错误信息写入到日志中,终端打印出这个对象的信息(这个对象肯定写有str方法) print(exception) # return None #如果返回None,仍然会使用django错误处理机制 # 在视图出现异常的时候,给用户一个友好的提示 return HttpResponse(‘站点流量太大,服务器繁忙,请稍后重试!‘)
以上是关于中间件 | Django开发的主要内容,如果未能解决你的问题,请参考以下文章