- 中间件是Django请求/响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入输出。
- 中间件以类的形式体现
- 每个中间件组件负责做一些特定的功能。例如:Django包含一个中间件组件AuthenticationMiddleware,它使用会话将用户与请求关联起来。
编写中间件
-
中间件类必须继承自django,urils.deprecation.MiddlewareMixin类
-
中间件类需事先下列五个方法中的一个或多个:
- process_request(self,request):
执行路由前被调用,在每个请求上调用,返回None或HttpResponse对象 - process_view(self,request,callback,callback_args,callback_kwargs):
调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象 - process_response(self,request,response)
所有响应返回浏览器前被调用,在每个请求上调用,返回HttpResponse对象 - process_exception(self,request,exception)
当处理过程中抛出异常时调用,返回一个HttpResponse对象 - process_template_response(self,request,response)
在视图函数执行完毕且试图返回的对象中包含render方法时被调用;该方法需要返回实现了render方法的响应对象
- process_request(self,request):
-
注:中间件的大多数方法在返回None时表示忽略当前操作进入下一项事件,当返回HttpResponse对象时表示此请求结束,直接返回给客户端
注册中间件
- settings.py 中需要注册一下,自定义的中间件
MIDDLEWARE = [
...
]
- 注意:配置为数组,中间件被调用时以“先上到下”再“由下到上”的顺序调用
案例:访问5次禁止访问
class VisitLimit(MiddlewareMixin):
visit_times = {}
def process_request(self,request):
ip_address = request.META['REMOTE_ADDR']
path_url = request.path_info
if not re.match('^/test',path_url):
return
times = self.visit_times.get(ip_address,0)
print('ip',ip_address,'已经访问',times)
self.visit_times[ip_address] = times + 1
if times < 5:
return
return HttpResponse("您已经访问过"+str(times)+"次,访问被禁止")
Django请求流程图.png
CSRF防范
- django采用'比对暗号'机制防止攻击
- Cookies中存储暗号1,模板中表单里藏着暗号2,用于只有在本网站下提交数据,暗号2才会随表单提交给服务器,django对比两个暗号,对比成功,则认为是合法请求,否则是违法请求-403响应码
配置步骤:
1,settings.py中确认MIDDLEWARE中django.middleware.csrf.CsrfViewMiddleware是否打开
2,模板中,form标签下添加如下标签
{% csrf_token %}
特殊说明
如果某个视图不需要django进行csrf保护,可以用装饰器关闭对此视图的检查
样例:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request):
return HttpResponse('Hello world')
网友评论