昨日回顾
1 django中的cookie的使用
-增 obj.set_cookie(k,v,max_age)
-删 obj.delete_cookie(key)
-查 request.COOKIE.get(key)
-改 obj.set_cookie(k,v,max_age)
2 django中session的使用(迁移数据库)
-增 obj.session[key] = value
-删 del request.session[key]
-全部删除 request.session.flush() # cookie和数据库都删除
request.session.delete()只删除数据库
-查 request.session[key]
-改 obj.session[key] = value
-超时时间
3 cbv加装饰器
-第一种:加在类上
from django.utils.decorators import method_decorator
@method_decorator(login_auth,name='get')
class UserList(views.View):
pass
-第二种:加在方法上
from django.utils.decorators import method_decorator
class UserList(views.View):
@method_decorator(login_auth)
def get(self):
pass
今日内容
1 django的session原理流程
2 自定义中间件
1 自定义步骤:
-写一个类,继承MiddlewareMixin
-里面写方法process_request(请求来了,一定会触发它的执行)
-在setting中配置(注意,放在前和放在后)
MIDDLEWARE = [
...
'app01.mymiddle.MyMiddleware1',
...
]
3process_request,process_response,process_view,process_exception
1 process_request(request对象)
2 process_response(request对象,response对象)
3 多个中间件,执行顺序是什么?
-请求来的时候从上往下执行:process_request
-请求走的时候,从下往上执行:process_response
4 process_request可以干什么?
-写一个中间件,不管前端用什么编码,在requset.data中都有post的数据
-频率限制(限制某个ip地址,一分钟只能访问5次)
-登录认证(只要没登录,重定向到login路径)、
-记录用户访问日志(ip,时间,访问路径)
5 process_response可以干什么?内部有response对象
-统一给所有(某几个路径)加cookie
-统一给所有(某几个路径)加响应头
6 process_view 路由匹配成功和视图函数执行之前执行(callback就是视图函数)
def process_view(self, request, callback, callback_args, callback_kwargs):
# print(callback)
# print(callback_args)
# print(callback_kwargs)
#
res=callback(request)
#
print("中间件1的process_view")
return res
7 process_exception 视图函数出错,会执行它(全局异常捕获)(记录日志,哪个ip地址,访问哪个路径,出的错)
# 全局异常捕获,返回4开头的
def process_exception(self, request, exception):
print(exception)
return render(request,'error.html')
4 CSRF_TOKEN跨站请求伪造
1 跨站请求伪造
2 代码演示
3 django解决了csrf攻击,中间件:django.middleware.csrf.CsrfViewMiddleware
4 后期中间件不能注释,每次发送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}}'},
# jquery.cookie.js
-在浏览器中对cookie进行增,删,查,改
-前后端分离(js操作cookie)
# 全局使用,局部禁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_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))
拓展
1 import_module 有啥用
2 登录认证中间件(没有登录就可以访问:login,home, 登录后才能访问:order,userlist,logout)
3 无论前端是什么编码的请求,后端视图函数都有request.data
4 (拓展) 写一个频率限制的功能(同一个ip地址,一分钟只能访问5次)
5 加入csrf以后写一个注册功能,通过form表单和ajax两个实现
6 整理课上讲的内容
7 记录用户访问日志(中间件中),查看访问日志(时间,ip,客户端类型)