django中间件是django的门户,django自带七个中间件,每个都有各自对应的功能
django不仅有自带的七个中间件,django还支持自定义中间件并提供五个可以自定义的方法
(1)process_request
(2)process_response
(3)process_view
(4)process_template_response
(5)process_excepton
只要是全局相关的功能都可在中间件中编写
例如:用户黑名单校验、用户访问频率校验、网站全局用户身份校验
1.创建一个任意名称的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内编写中间件类
4.配置文件中注册
1.process_request
请求来的时候会从上往下依次执行配置文件中注册了的中间件里面的process_request方法,若没有则直接跳过
若该方法自己返回了HttpResponse对象,那么请求不再继续往后直接返回相应的数据
2.process_response
响应走的时候会从下往上依次执行配置文件中注册了的中间件里面的process_response方法,若没有则直接跳过
若该方法自己返回了HttpResponse对象,那么响应会替换成该HttpResponse对象数据,而不再是视图函数想要返回给客户端的数据
注意:若process_request返回了HttpResponse对象,那么会从当前位置从下往上执行每一个process_response
1.process_view
路由匹配成功之后执行视图之前从上往下执行配置文件中注册了的中间件里面的process_view方法
2.process_template_response
视图函数执行完毕之后返回的对象中含有render属性对应一个render方法
则会从下往上执行配置文件中注册了的中间件里面的process_template_response方法
3.process_exception
视图函数执行过程中报错并在返回响应的时候会从下往上执行配置文件中注册了的中间件里面的process_exception
csrf,中文名,跨站请求伪造。csrf是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法,利用的是网站对用户网页浏览器的信任。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> {% load static %} <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> <script src="{% static 'jquery-3.6.0.js' %}"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-4 col-md-offset-4"> <br><br><br> <form action="" method="post"> {% csrf_token %} <p>当前账户:<input type="text" name="current_user"></p> <p>目标账户:<input type="text" name="target_user"></p> <p>转账金额:<input type="text" name="money"></p> <input type="submit"> </form> </div> </div> </div> </body> </html>
def test_csrf(request): if request.method == 'POST': current_user = request.POST.get('current_user') target_user = request.POST.get('target_user') money = request.POST.get('money') return HttpResponse(f'<br><br><br><h2 style="text-align:center">用户{current_user}给用户{target_user}转账{money}元</h2>') return render(request, 'test_csrf.html')