中间件

	cbv加装饰器
		-先导入:from django.utils.decorators import method_decorator
		-1 可以在方法上加装饰器:
			@method_decorator(login_auth)
		-2 可以在类上加
			@method_decorator(login_auth,name='post')
			@method_decorator(login_auth,name='get')
		-3 可以加在dishpatch方法上
			@method_decorator(login_auth)
			一旦加在dishpatch,说明,所有方法都加了装饰器
			
	中间件
		-中间件是什么?请求和响应之间的一道屏障
		-中间件作用:控制请求和响应
		-django中内置几个中间件
		-自定义中间件
			-from django.utils.deprecation import MiddlewareMixin   先导入
			-定义一个类,随意命名,继承MiddlewareMixin
			class MyMiddleware1(MiddlewareMixin):
				def process_request(self, request):
					print('MyMiddleware---->1---->process_request')
					# 返回HttpRspons对象,直接返回,走自己的process_response
					# 返回None的时候,继续往下走
					# return HttpResponse('i am middle--1')
					return None

				def process_response(self, request, response):

					print('MyMiddleware--->1---->process_response')
					return response
			-使用:在setting中注册,是有顺序的,
				MIDDLEWARE = [
				'app01.mymiddelware.MyMiddleware1',
				]
			
		-中间件执行顺序:
			-process_request,从上往下执行
				-如果retrun HttpResponse的对象,直接返回了
				-如果retrun None ,继续往下走
			-process_response,从下往上执行
				-必须要retrun Httpresponse的对象
		-中间件的方法:()
			-process_request
				-请求来的时候,会响应它
			-process_response
				-响应回去的时候,会走它
			-process_view(了解)
				- request, callback(视图函数), callback_args(无名分组的参数), callback_kwargs(有名分组的参数)
				-执行顺序,详见图


			-def process_exception(self, request, exception)(了解)
			-def process_template_response(self, request, response):(了解)
	csrf:跨站请求伪造	
		比如:转账请求:transfer?to=lqz&count=1000
		-是什么?攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的
		-如何防范:
			-通过refer
			-加一个随机字符串校验(加载请求的路径里,加载请求体中)
			-在请求头中加字符串校验
		django中的应用:
			-中间件不注释掉
			-以后再发post请求,携带那个随机字符串
				-form表单形式:
					<form action="" method="post">
						{% csrf_token %}
						<input type="text" name="name">
						<input type="text" name="pwd">
						<input type="submit" value="提交">
					</form>
				-ajax提交
				data: {
					'name': $('[name="name"]').val(),
					'pwd': $('[name="pwd"]').val(),
					//'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()
					'csrfmiddlewaretoken': '{{ csrf_token }}'
					},
		csrf:局部禁用,局部使用
			-用装饰器:from django.views.decorators.csrf import csrf_exempt,csrf_protect
			-fbv--->直接加载fbv上就行了
				-局部禁用,全局得使用
				 @csrf_exempt
				 def csrf_disable(request):
				         print(request.POST)
				         return HttpResponse('ok')
				-局部使用,全局得禁用
				 @csrf_protect
				 def csrf_disable(request):
				         print(request.POST)
				         return HttpResponse('ok')
			-cbv-->只能加在dispatch方法或者类上面
				-局部禁用,全局得使用
				-局部使用,全局得禁用
				from django.views import View
				from django.utils.decorators import method_decorator
				@method_decorator(csrf_protect,name='dispatch')
				class Csrf_disable(View):
					# @method_decorator(csrf_protect)
					def dispatch(self, request, *args, **kwargs):
						ret=super().dispatch(request, *args, **kwargs)
						return ret
					def get(self,request):
						return HttpResponse('ok')

					def post(self,request):
						return HttpResponse('post---ok')
概括
	中间件:
		-django请求生命周期:
		-中间件:对全局请求的修改,和全局响应的修改
		-process_request:从上往下执行
		-process_response:从下往上
		-process_view
		-process_exception
		-process_template_response
	csrf:跨站请求伪造
		-django处理了这种攻击:中间件
		-往后台传json数据,可以放在头中
	xss攻击:跨站脚本攻击
	
	局部,全局禁用csrf:
		-全局禁用:注释掉中间件
			-局部使用:
				-fbv
					from django.views.decorators.csrf import csrf_exempt,csrf_protect
					@csrf_protect
					视图函数
				-cbv
					-from django.utils.decorators import method_decorator
					-只能 加在类上(name=dispatch),或者加在dispatch方法上

代码示范
from django.utils.deprecation import MiddlewareMixin

from django.shortcuts import render,HttpResponse
class MyMiddleware1(MiddlewareMixin):
    def process_request(self, request):
        print('MyMiddleware---->1---->process_request')
        # 返回HttpRspons对象,直接返回,走自己的process_response
        # 返回None的时候,继续往下走
        # return HttpResponse('i am middle--1')
        return None

    def process_response(self, request, response):

        print('MyMiddleware--->1---->process_response')
        return response

    # def process_view(self, request, callback, callback_args, callback_kwargs):
    #     print('MyMiddleware--->1',callback)
    #     print(callback_args)
    #     print(callback_kwargs)
    #     ret = callback(request)
    #     return ret

    # def process_exception(self, request, exception):
    #     print('middle--1---exception')
    #     print(exception)
    #     return HttpResponse(exception)
    def process_template_response(self, request, response):
        print('process_template_response')
        return response


class MyMiddleware2(MiddlewareMixin):
    def process_request(self, request):
        # print(request.GET.get('name'))
        print('MyMiddleware--->2---->process_request')
        # return HttpResponse('i am middle--2')

    def process_response(self, request, response):
        print('MyMiddleware--->2---->process_response')
        # response.set_cookie('name','lqz')
        return response

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('MyMiddleware--->2',callback)
        print(callback_args)
        print(callback_kwargs)
 
posted @ 2018-11-23 15:24  不沉之月  阅读(164)  评论(0编辑  收藏  举报