中间件: 1. 过滤请求,
2. 自定义中间件, 只要是全局相关的功能你都应该考虑使用django中间件来帮你完成
djang中间件
它是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',
]
自定义中间件:
class SessionMiddleware(MiddlewareMixin): def process_request(self, request): def process_response(self, request, response): class CsrfViewMiddleware(MiddlewareMixin): def process_request(self, request): def process_view(self, request, callback, callback_args, callback_kwargs): def process_response(self, request, response): class AuthenticationMiddleware(MiddlewareMixin): def process_request(self, request):
django 的自定义方法:
django运行用户自定义中间件并且暴露给用户五个可以自定义的方法 1.需要掌握的 process_request(******) 请求来的时候会按照配置文件中注册的中间件从上往下的顺序依次执行每一个中间件里面的process_request方法,如果没有直接跳过执行下一个 同级别返回 并不会全部执行process_response process_response 响应走的时候会按照配置文件中注册的中间件从下往上的顺序依次执行每一个中间件里面的 process_response方法 该方法必须要有两个形参 并且需要将形参response返回 如果你内部自己返回了HttpResponse对象 会将返回给用户浏览器的内容替换成你自己的 2.需要了解的 process_view 路由匹配成功执行视图函数之前触发 process_template_reponse 视图函数返回的对象中必须要有render属性对应的render方法 def index(request): print('我是视图函数index') def render(): return HttpResponse("你好啊 我是index里面的render函数") obj = HttpResponse("index") obj.render = render return obj process_exception 当视图函数报错的时候自动触发 信号量
csrf :跨站伪造保护机制
跨站请求伪造csrf 钓鱼网站 本质搭建一个跟正常网站一模一样的页面 用户在该页面上完成转账功能 转账的请求确实是朝着正常网站的服务端提交 唯一不同的在于收款账户人不同 给用户书写form表单 对方账户的input没有name属性 你自己悄悄提前写好了一个具有默认的并且是隐藏的具有name属性的input 模拟钓鱼网站
form 表单 ajax 如何csrf 校验
form表单如何通过csrf校验 你只需要在你的form表单内写一个 {% csrf_token %} ajax如何通过csrf校验 // 第一种方式 自己手动获取 {#data:{'username':'jason','csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},#} // 第二种方式 利用模板语法 {#data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},#} // 第三种 通用方式 引入外部js文件 官网提供的方式 {% load static %} <script src="{% static 'myset.js' %}"></script> data:{'username':'jason'} csrf相关装饰器 当我们网站整体都校验csrf的时候 我想让某几个视图函数不校验 当我们网站整体都不校验csrf的时候 我想让某几个视图函数校验 from django.views.decorators.csrf import csrf_exempt, csrf_protect from django.views import View9 from django.utils.decorators import method_decorator # @method_decorator(csrf_protect,name='post') # 第二种指名道姓的给类中某个方法装 # @method_decorator(csrf_exempt,name='post') # csrf_exempt 第二种方式不行 @method_decorator(csrf_exempt,name='dispatch') # 可以!!! class MyHome(View): # APIView # @method_decorator(csrf_protect) # 第三种 类中所有的方法都装 # @method_decorator(csrf_exempt) # csrf_exempt 第三种方式可以 def dispatch(self, request, *args, **kwargs): return super().dispatch(request,*args,**kwargs) def get(self,request): return HttpResponse('get') # @method_decorator(csrf_protect) # 第一种方式 # @method_decorator(csrf_exempt) # csrf_exempt 第一种方式不行 def post(self,request): return HttpResponse('post') """ 给CBV加装饰器 推荐你使用模块method_decorator 我们自己写的装饰器和csrf_protect用法一致 唯独csrf_exempt是一个特例 只能给dispatch方法装 """