django_操作session
目录
一.django操作cookie补充
1.加密处理
set_signed_cookie(key,value,salt='加密处理')
set_signed_cookie(key,value,max_age=超时时间:默认是秒数)
expires:专门针对IE浏览器设置超时时间 # 没有这个浏览器
res.delete_cookie('key') # 删除
加密
** max_age内写多久cookie保存的数据就存在多久**
二.django操作session
#session操作进行 对表进行增加 删除
def set_session(request):
request.session['name1'] = '孤芳自赏'
request.session['name2'] = '咒术回战'
request.session['name3'] = '一途'
return HttpResponse("set_session操作")
# 会存到表中进行保存
"""
服务端保存用户相关状态信息 返回给客户端随机字符串
针对保存 django需要一张表来处理 >>> 自带的django_session表
ps:django数据库迁移命令会产生一堆默认的表 其中就有一张django_session表
"""
def get_session(request):
res1 = request.session.get('name1')
res2 = request.session.get('name2')
res3 = request.session.get('name3')
print(res1, res2, res3)
#取出表中的数据 孤芳自赏 咒术回战 一途
print(request.sesion.session_key)
#表中的密文查看 1ntWAG:GCHb1r-aG7OW 类似这种密文
return HttpResponse('get_session操作')
1.1session内部发生的事情
# 设置session
1.产生一个随机字符串
2.表中存储随机字符串与加密数据的对应关系
3.并将产生的随机字符串也给客户端发送一份并让其保存
# sessionid:随机字符串
# 获取session
1.自动获取客户端请求中的随机字符串
2.自动去存储session数据的表中比对
3.如果比对成功自动获取并'解密处理'
# django默认的session失效时间是14天
三.django操作session补充
request.session.session_key # 获取产生的随机字符串
request.session.delete() # 只删客户端
request.session.flush() # 服务端 客户端都删
# 设置超时时间四种方式
request.session.set_expiry(value)
1. value是个整数,session会在些秒数后失效。
2. value是个datatime或timedelta,session就会在这个时间后失效。
3. value是0,用户关闭浏览器session就会失效。
4. value是None,session会依赖全局session失效策略。
针对session数据的存储位置 有五种方案
1.数据库存储
2.缓存存储
3.文件存储
4.缓存+数据库存储
5.动态加密
四.CBV添加装饰器
'''需要借助于一个专门的装饰器模块'''
'from django.utils.decorators import method_decorator'
# 方式1:直接在类中的某个方法上添加
class MyLoginView(views.View):
@method_decorator(login_auth)
def post(self, request):
return HttpResponse("from CBV get view")
# 方式2:直接在类名上添加并指定
@method_decorator(login_auth, name='get')
class MyLoginView(views.View):
def get(self, request):
return HttpResponse("from CBV get view")
# 方式3:重写dispatch方法并添加作用于类中所有的方法
class MyLoginView(views.View):
@method_decorator(login_auth)
def dispatch(self, request, *args, **kwargs):
super().dispatch(request,*args,**kwargs)
五.django中间件
是django的门户 自带七个中间件 每个都有各自对应的功能
1.1django提供的自定义中间间的五个方法
如何创建自定义中间件
1.创建一个任意名称的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内编写中间件类
4.配置文件中注册
上图有自定义
1.process_request
"""
请求来的时候会从上往下依次执行配置0.文件中注册了的中间件里面的process_request方法 如果没有则直接跳过
如果该方法自己返回了HttpResponse对象,那么请求不再继续往后直接返回相应的数据
"""
2.process_response
"""
响应走的时候会从下往上依次执行配置文件中注册了的中间件里面的process_response方法 如果没有则直接跳过
如果该方法自己返回了HttpResponse对象,那么响应会替换成该HttpResponse对象数据 而不再是视图函数想要返回给客户端的数据
"""
# 如果process_request返回了HttpResponse对象 那么会从当前位置从下往上执行每一个
3.process_view
"""
路由匹配成功之后执行视图之前从上往下执行配置文件中注册了的中间件里面的process_view方法
"""
4.process_template_response
"""
视图函数执行完毕之后返回的对象中含有render属性对应一个render方法
则会从下往上执行配置文件中注册了的中间件里面的process_template_response方法
"""
5.process_exception
"""
视图函数执行过程中报错并在返回响应的时候会从下往上执行配置文件中注册了的中间件里面的process_exception
"""
六.csrf跨站请求伪造
钓鱼网站:一个模仿正规网站的网址 诱骗用户在该网站上做本应该在正规网站上做的操作,从而获取到该用户在正规网站上的数据甚至是财产
eg:假设我们需要登录网页完成转账操作
我们不小心登录到了钓鱼网站 填写了账户 密码 对方账户等信息
点击转账之后我们账户的钱确实减少了 但是对方账户却变成了一个你从来不认识的人
1.1csrf解决策略
# form表单
{% csrf_token %}
# ajax请求
模板语法直接获取
csrfmiddlewaretoken:{{ csrf_token }}
<form action="" method="post">
{% csrf_token %}
<p>当前账户:<input type="text" name="current_user"></p>
<p>目标账户:<input type="text" name="target_user"></p>
<p>转账金额:<input type="text" name="money"></p>
<input type="submit">
</form>
<script>
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
data:{
'current_user':$('input[name="current_user"]').val(),
'target_user':$('input[name="target_user"]').val(),
'money':$('input[name="money"]').val(),
{#'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()#}
{#'csrfmiddlewaretoken':{{ csrf_token }}#}
},
success:function (args) {
alert(args)
}
})
})
</script>
昨日作业
def my_login(func_name):
def inner(request,*args,**kwargs):
my_path = request.get_full_path()
if request.COOKIES.get('name'):
res = func_name(request,*args,**kwargs)
return res
else:
return redirect(f'/login/?next={my_path}')
return inner
@my_login
def my_func(request):
return HttpResponse('登陆后的my_func')
@my_login
def func(request):
return HttpResponse('登陆后的func')
def home(request):
return HttpResponse('登陆成功')
# get获取用户输入的后缀进行判断是否登陆
def login(request):
if request.method == 'POST':
name = request.POST.get('name')
if name == 'thn':
next_path = request.GET.get('next')
if next_path:
res = redirect(next_path)
else:
res = redirect('/home/')
res.set_signed_cookie('name','thn',salt='加盐')
return res
return render(request,'login.html')