57.1 django中间件

中间件: 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方法装
		"""	

  

猜你喜欢

转载自www.cnblogs.com/bigbox/p/12193420.html
今日推荐