Django第十六日
一 django的session原理流程
二 自定义中间件
自定义步骤:
- 写一个类,继承
MiddlewareMixin
,导入语法:from django.utils.deprecation import MiddlewareMixin
- 里面写方法process_request(请求来了,一定会触发它的执行)
- 在setting中配置(注意顺序,是放在前还是放在后)
MIDDLEWARE = [
'app01.mymiddle.MyMiddleware1',
]
三 process_request,process_response,process_view,process_exception
MiddlewareMixin
对象的四大方法
-
process_request
(request对象) -
process_response
(request对象,response对象) -
多个中间件,执行顺序是什么?
请求来的时候从上往下执行:process_request
请求走的时候,从下往上执行:process_response
-
process_request
可以干什么?- 写一个中间件,不管前端用什么编码,在requset.data中都有post的数据
- 频率限制(限制某个ip地址,一分钟只能访问5次)
- 登录认证(只要没登录,重定向到login路径)
- 记录用户访问日志(ip,时间,访问路径)
-
process_response
可以干什么?内部有response对象- 统一给所有(某几个路径)加cookie
- 统一给所有(某几个路径)加响应头
-
process_view
路由匹配成功和视图函数执行之前执行(callback就是视图函数)
def process_view(self, request, callback, callback_args, callback_kwargs): # print(callback) # print(callback_args) # print(callback_kwargs) # res=callback(request) # 使视图函数提前到process_view之前执行 # print("中间件1的process_view") return res
-
process_exception
视图函数出错,会执行它(全局异常捕获)(记录日志,哪个ip地址,访问哪个路径,出的错)# 全局异常捕获,返回4开头的 def process_exception(self, request, exception): print(exception) return render(request,'error.html')
四 CSRF_TOKEN跨站请求伪造
-
django解决csrf攻击方法,利用中间件:
django.middleware.csrf.CsrfViewMiddleware
-
后期中间件不能注释,每次发送post请求,都需要携带csrf_token随机字符串
-
form表单提交
在form表单中{% csrf_token %}
-
ajax提交(如何携带)
- 方式一:放到data中
$.ajax({ url: '/csrf_test/', method: 'post', data: {'name': $('[name="name"]').val(), 'password': $('[name="password"]').val(), 'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val() /* 利用了元素查询的方法 */ }, success: function (data) { console.log('成功了') console.log(data) }, error: function (data) { console.log('xxxxx') console.log(data) } })
- 方式二:放到data中
'csrfmiddlewaretoken':'{{ csrf_token }}'
- 方式三:放到头中
headers:{'X-CSRFToken':'{{csrf_token}}'},
- 方式一:放到data中
-
-
全局使用,局部禁csrf
在视图函数上加装饰器的方法from django.views.decorators.csrf import csrf_exempt,csrf_protect # 全局启用,局部禁用(中间件不能注释,这个视图函数,已经没有csrf校验了) @csrf_exempt def csrf_test(request): if request.method=='GET': return render(request,'csrf_test.html') else: name=request.POST.get('name') password=request.POST.get('password') print(name) print(password) return HttpResponse('登录成功')
-
全局禁用,局部使用csrf(需要注释掉csrf中间件)
@csrf_protect def csrf_test(request): if request.method=='GET': return render(request,'csrf_test.html') else: name=request.POST.get('name') password=request.POST.get('password') print(name) print(password) return HttpResponse('登录成功')
-
古怪的使用方式,在urls.py中导入装饰器,并在路由中使用
path('csrf_test/', csrf_exempt(views.csrf_test))