杨梅冲
每天在想什么呢?

一、Django中间件简介

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

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

django中间件就类似于是django的保安,消息来的时候和响应走的时候 都必须走过中间件

优点:

  中间件可以做全局的访问频率校验 身份校验 。。。
  只要是涉及到全局的 你都可以考虑使用中间件来做!!!

 

django默认有七个中间件,也支持用户自定义中间件
自定义中间件 django暴露给用户五个可以自定义的方法

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',
]

1.1 自定义中间件

  中间件里写的方法影响的是全局:

    网站全局校验:如果用户没有登录,网站里都不能访问

  中间件可以定义五个方法,分别是:(主要的是process_request和process_response)

# 五个方法
        # 掌握
        process_request:请求来的时候,会依次(从上往下的顺序)执行每一个中间件里面的process_request方法(如果没有定义那么直接通过)
        process_response:响应走的时候,会依次(从下往上的顺序)执行每一个中间件里面的process_response方法
        # 了解
        process_views
        process_templates_response
        process_exceptions
django的中间件不单单有默认的,还支持用户自定义
自定义的时候可以设置五个方法
    必须掌握的
        1.process_request(使用频率最高)
            1.请求来的时候会按照配置文件中已经注册的中间件
            从上往下依次执行每一个中间件里面的process_request方法
            如果没有直接跳过
            2.如果该方法直接返回了HttpResponse对象,那么请求直接原地返回
            不再继续往里面执行
        2.process_response(使用频率较低)
            1.响应走的会按照配置文件中已经注册的中间件
            从下往上依次执行每一个中间件里面的process_response方法
            如果没有直接跳过
            2.该方法必须返回一个HttpResponse对象
    需要了解的(楼一眼即可)
        3.process_view
            路由匹配成功之后执行视图函数之前触发
        4.process_template_response(偏门)
            返回的对象中包含render属性自动触发
        5.process_exception
            视图函数报错之后自动触发

如何自定义中间件

1.在应用下创建一个文件夹mymiddleware
2.再创建一个写中间件myadd.py文件
3.书写固定的中间件自定义代码

from django.utils.deprecation import MiddlewareMixin
class MyMdd(MiddlewareMixin):
def process_request(self,request):
print('from md1')

4.settings配置文件MIDDLEWARE中注册

Django如何执行request和response方法

  request 它的返回值可以是None也可以是HttpResponse对象。返回值是None的话,按正常流程继续走,交给下一个中间件处理,如果是HttpResponse对象Django将不执行视图函数,而将相应对象返回给浏览器

# 自定义中间件    
    1.新建一个任意名称的py文件
    2.文件内 写类继承中间件的总类

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class MyMdd(MiddlewareMixin): 
  
def process_request(self,request): print("我是第一个中间件里面的process_request方法")
    # return HttpResponse("如果这里有返回的话,访问到第一个中间件完成后就返回了")
def process_response(self,request,response): # response后端固定返回给前端的结果 print("我是第一个中间件里的process_response方法") return response class MyMdd2(MiddlewareMixin): def process_request(self,request): print("我是第2个中间件里面的process_request方法") def process_response(self,request,response): print("我是第2个中间件里的process_response方法") return response

# 中间件注册 setting.py中MIDDLEWARE里添加
'cdn.mymiddleware.myadd.MyMdd',  # 项目名称.中间件放置的目录.文件名称.中间件名称
'cdn.mymiddleware.myadd.MyMdd2',

访问结果:
我是第一个中间件里面的process_request方法
我是第2个中间件里面的process_request方法

views.py中返回访问的视图函数内容(另外:如果response中写了返回的东西,就会返回这个)
我是第2个中间件里的process_response方法
我是第一个中间件里的process_response方法

详细请查看:https://www.cnblogs.com/Dominic-Ji/p/9229509.html

 

2.跨站请求伪造先仿造一个跟中国银行一模一样的网站

用户在该网站实行转账,发现自己中国银行账户的钱确实少了
但是收款人却不是自己指定的,而是一个陌生人

csrf
    在请求真网站的时候会返回一个随机的字符串
    之后会校验该随机字符串是否正确

1.form表单如何通过csrf校验
    <form action="" method="post">
        {% csrf_token %}  #页面可以查看token:<input type="hidden" name="csrfmiddlewaretoken" value="kgH5Fal1KAJsr6rluDpvJbA3EirCHemJ9iBeAMt7KhzU9eotGmIs99E8hPdbTG3S">
    <p>用户名:<input type="text" class="form-control" name="username"></p>
    <p>密码:<input type="text" class="form-control" name="password"></p>
    <input type="submit" class="btn btn-danger pull-left">
</form>
2.ajax如何通过csrf校验 // 第一种:最繁琐 {'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()}, // 第二种:django提供 data:{'csrfmiddlewaretoken':'{{ csrf_token }}'}, // 第三种:通用的引入官网提供的js代码 function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } var csrftoken = getCookie('csrftoken'); function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function (xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } });

 

posted on 2019-09-05 15:03  杨梅冲  阅读(193)  评论(0编辑  收藏  举报