django操作session、django中间件简介、五个常见方法、CBV添加装饰器的三种方式、csrf跨站请求伪造
set_signed_cookie(key,value,salt='加密盐') set_signed_cookie(key,value,max_age=超时时间:默认是秒数) expires:专门针对IE浏览器设置超时时间 HttpResponse对象.delete_cookie(key)
# 设置 request.session['key'] = value # 可以设置多组 # 获取 request.session.get('key') # 可以获取多组 """ 服务端保存用户相关状态信息 返回给客户端随机字符串 针对保存 django需要一张表来处理 >>> 自带的django_session表 ps:django数据库迁移命令会产生一堆默认的表 其中就有一张django_session表 """ 1.设置session内部发生的事情 1.产生一个随机字符串 2.表中存储随机字符串与加密数据的对应关系 3.并将产生的随机字符串也给客户端发送一份并让其保存 sessionid:随机字符串 2.获取session内部发送的事情 1.自动获取客户端请求中的随机字符串 2.自动去存储session数据的表中比对 3.如果比对成功自动获取并'解密处理' # django默认的session失效时间是14天


request.session.session_key # 获取产生的随机字符串 request.session.delete() # 只删客户端 request.session.flush() # 服务端 客户端都删 request.session.set_expiry(value) # 设置超时时间 * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。 针对session数据的存储位置 有五种方案 1.数据库存储 2.缓存存储 3.文件存储 4.缓存+数据库存储 5.动态加密
'''需要借助于一个专门的装饰器模块''' from django.utils.decorators import method_decorator # 方式1:直接在类中的某个方法上添加 class MyLoginView(views.View): @method_decorator(login_auth) def get(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.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',
django不单有七个中间件并且每个都有很多功能和方法,除此之外django还支持自定义中间件并提供五个可以自定义的方法
process_request
process_response
process_view
process_template_response
process_excepton
django中间件的使用场景:只要是全局相关的功能都可以在中间件中编写
eg:用户黑名单校验、用户访问频率校验、网站全局用户身份校验
""" 1.创建一个任意名称的文件夹 2.在该文件夹内创建一个任意名称的py文件 3.在该py文件内编写中间件类 4.配置文件中注册 """ # 必须要掌握的方法 1.process_request 请求来的时候会从上往下依次执行配置文件中注册了的中间件里面的process_request方法 如果没有则直接跳过 如果该方法自己返回了HttpResponse对象,那么请求不再继续往后直接返回相应的数据 2.process_response 响应走的时候会从下往上依次执行配置文件中注册了的中间件里面的process_response方法 如果没有则直接跳过 如果该方法自己返回了HttpResponse对象,那么响应会替换成该HttpResponse对象数据 而不再是视图函数想要返回给客户端的数据 """如果process_request返回了HttpResponse对象 那么会从当前位置从下往上执行每一个process_response""" # 需要了解的方法 1.process_view 路由匹配成功之后执行视图之前从上往下执行配置文件中注册了的中间件里面的process_view方法 2.process_template_response 视图函数执行完毕之后返回的对象中含有render属性对应一个render方法 则会从下往上执行配置文件中注册了的中间件里面的process_template_response方法 3.process_exception 视图函数执行过程中报错并在返回响应的时候会从下往上执行配置文件中注册了的中间件里面的process_exception
钓鱼网站:一个模仿正规网站的网址 诱骗用户在该网站上做本应该在正规网站上做的操作,从而获取到该用户在正规网站上的数据甚至是财产
eg:假设我们需要登录网页完成转账操作
我们不小心登录到了钓鱼网站 填写了账户 密码 对方账户等信息
点击转账之后我们账户的钱确实减少了 但是对方账户却变成了一个你从来不认识的人
原理:将收款人的账号 提前写成犯罪分子的然后隐藏 暴露给用户一个没有name属性的标签写着玩
# 简单模拟 开设两个django项目 模拟两个相同的页面
<h2>钓鱼的网站</h2> <form action="http://127.0.0.1:8000/ab_csrf/" method="post"> <p>当前账户:<input type="text" name="current_user"></p> <p>目标账户:<input type="text"></p> <p style="display: none">目标账户:<input type="text" name="target_user" value="宇帆"></p> <p>转账金额:<input type="text" name="money"></p> <input type="submit">
<h2>正规网站</h2> <form action="" method="post"> <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">
def de_csrf(request): if request.method == 'POST': current_user = request.POST.get('current_user') target_user = request.POST.get('target_user') money = request.POST.get('money') return HttpResponse(f'{current_user} 给 {target_user} 转了 {money}块钱') return render(request, 'de_csrf.html')
"""针对csrf相关的校验有很多种方式 django只是提供了一些而已""" # form表单 <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> # ajax请求 1.方式1:页面任意位置先写{% csrf_token %} 之后获取数据 'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val() 2.方式2:模板语法直接获取 'csrfmiddlewaretoken':{{ csrf_token }} """通用解决方案:js脚本自动处理""" 也只能适用于ajax提交 form表单还是需要额外指定

浙公网安备 33010602011771号