Django 中间件,csrf

Django 中间件,csrf

1、中间件简介

官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。

但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。

说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。

我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下图的MIDDLEWARE配置项。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

2、什么是中间件:

Django请求生命周期完整版,中间类似Django的门卫,数据在进入和离开时都要经过中间件

3、中间件的作用:

能帮助实现网站全局的身份验证,黑名单,白名单,访问频率限制,以及反爬相关

4、自定义中间件:

Django默认七个中间件,但是Django暴露给用户可以自定义中间并且里面可以写五种方法

注:

  • 请求来的时候,会依次执行每个中间件里面的process_request方法(如果没有直接通过)
  • 响应来的时候会依次执行每个中间件里面的process_response方法(如果没有直接通过)
4.1 五种方法:
process_request: 请求来的时候,从上往下依次执行每个中间件里面的process_request
process_response: 响应走的时候,从下往上依次执行每个中间件里面的process_response
process_view:路由匹配成执行视图前自动触发,从上往下执行
process_exception:当视图函数报错了,自动触发(从下往上执行)
process_template_response: 视图函数返回的对象有一个render()方法
    或者表名该对象是一个TemplateResponse对象或等价方法,(从下往上依次执行
4.2 如何自定义中间件:

  • 先定创建一个文件夹:如图中所示mymiddleware
  • 在文件夹中建立一个py 文件:如mymiddle.py
  • 在py 文件中编写程序:

# 导入模块:
from django.utils.deprecation import MiddlewareMixin  
# MiddlewareMixin本质就是5个可以修改的方法类,所以自定义的中间件都需要继承他
class MD1(MiddlewareMixin):
    def process_request(self, request):
        print('MD1里面的process_request')



class MD2(MiddlewareMixin):
    def process_request(self, request):
        print('MD2里面的process_request')
#process_request
  • 中间件的process_request 方法是在执行视图函数之前执行的
  • 当配置多个中间件事,会按照middleware中的顺序执行,也是就是列表的索引值执行,从前到后依次执行
  • 不同中间件之间传递的request都是同一个对象
总结:
(1) 中间件的process_request方法是在执行视图函数之前执行的。
(2) 当配置多个中间件时,会按照MIDDLEWARE中的注册顺序,也就是列表的索引值,从前到后依次执行的。
(3) 不同中间件之间传递的request都是同一个对象。
多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序倒序执行的,
第一个中间件的process_request方法首先执行,而它的process_response方法最后执行,
最后一个中间件的process_request方法最后一个执行,它的process_response方法是最先执行。

5、csrf

5.1 举个例子

​ 钓鱼网站:银行转账的路径,可以拿到,然后你做一个跟银行一模一样的页面,也朝银行的接口提交数据,当用户在钓鱼网站输入对方账户名和转账金额之后,点击发送。其实内部是将对方账户换成了钓鱼网站的造假人员的账户,造成你转账转错账户的情况。

5.2 如何设置csrf_token
(1) 在form表单中应用
    <form action="" method="post">
        {% csrf_token %}
        <p>用户名:<input type="text" name="name"></p>
        <p>密码:<input type="text" name="password"></p>
        <p><input type="submit"></p>
    </form>
    
(2) Ajax中应用
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>用户名:<input type="text" name="name"></p>
    <p>密码:<input type="text" name="password" id="pwd"></p>
    <p><input type="submit"></p>
</form>
<button class="btn">点我</button>
</body>
<script>
    $(".btn").click(function () {
        $.ajax({
            url: '',
            type: 'post',
            data: {
                'name': $('[name="name"]').val(),
                'password': $("#pwd").val(),
                'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()
            },
            success: function (data) {
                console.log(data)
            }
        })
    })
</script>
</html>
5.3 csrf_token 使用范围
# 只想给某个视图函数加上csrf校验
from django.views.decorators.csrf import csrf_exempt,csrf_protect

# 局部禁用
@csrf_exempt
def index(request):
  pass

# 局部使用
@csrf_protect
def login(request):
  pass

# CBV比较特殊,不能单独加在某个方法上
# 只能加在类上或dispatch方法上
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect

@method_decorator(csrf_exempt,name='dispatch')  # 第一种
class Csrf_Token(View):
  @method_decorator(csrf_exempt)  # 第二种
  def dispatch(self,request,*args,**kwargs):
    res = super().dispatch(request,*args,**kwargs)
    return res
  @method_decorator(csrf_exempt)  # 这里这么写不行!!!
  def get(self,request):
    pass
  def post(self,request):
    pass
原文地址:https://www.cnblogs.com/king-home/p/11049063.html