本文主要是介绍cookie session 中间件,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
- 作业讲解
- django操作cookie补充
- django操作session
- django操作session补充
- CBV添加装饰器
- django中间件
- 自定义中间件
- csrf跨站请求伪造
- csrf解决策略
作业讲解
def login_auth(func_name):
def inner(request, *args, **kwargs):
# print(request.path)
# print(request.path_info)
# 1.获取用户没有登录之前想要访问的网址地址
target_path = request.get_full_path()
if request.COOKIES.get('name'):
res = func_name(request, *args, **kwargs)
return res
else:
# 2.将用户想要访问的地址当做参数传给登录功能
return redirect(f'/login/?next={target_path}')
return inner
def login(request):
if request.method == 'POST':
name = request.POST.get("name")
if name == 'jason':
# 获取用户登录之前想要访问的地址
next_path = request.GET.get('next')
'''注意 用户也有可能直接访问的登录页面 没有想要访问的其他页面'''
if next_path:
res = redirect(next_path) # 跳转到之前想要访问的界面
else:
res = redirect('/home/') # 默认登录之后跳转的界面
res.set_cookie('name', 'jason')
return res
return render(request, 'login.html')
django操作cookie补充
set_signed_cookie(key,value,sault='加盐内容')
set_signed_cookie(key,value,max_age=超时时间:默认是秒数)
HttpResponse对象.delete_cookie(key)
django操作session
# 设置
request.session['key'] = value # 可以设置多组
# 获取
request.session.get('key') # 可以获取多组
'''
服务端保存用户相关状态信息 返回给客户端随机字符串
针对保存 django需要一张表来处理>>>自带的
django_session表
django数据库迁移命令会产生 一堆默认的表 其中一张django_session表
'''
1. 设置session内部发送的事情
产生一个随机字符串
表中存储随机字符串与加密的数据的对应的关系
将产生的随机字符串也给客户端发送一份并让其保存 sessionid:随机字符串
2.获取session内部发送的事情
自动获取客户端请求中的随机字符串
自动取存储session数据的表中比对
如果比对成功自动获取并解密处理
django默认的session失效时间是14天
django操作session补充
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.动态加密
CBV添加装饰器
'''需要借助于一个专门的装饰器模块'''
from django.utils.decorators import method_decorator
# 方式1:直接在类中的某个方法上添加
class MyLoginView(views.View):
@method_decorator(login_auth)
def get(self,request):
return HttpResponse("from CBV")
# 方式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的门户 自带七个中间件 每个都有各自对应的功能
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方法 如果没有就直接跳过
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
csrf跨站请求伪造
钓鱼网站:一个模仿正规网站的网址 诱骗用户在该网站上做本应该在正规网站上做的操作,从而获取到该用户在正规网站上的数据甚至是财产
eg:假设我们需要登录网页完成转账操作
我们不小心登录到了钓鱼网站 填写了账户 密码 对方账户等信息
点击转账之后我们账户的钱确实减少了 但是对方账户却变成了一个你从来不认识的人
原理:将收款人的账号 提前写成犯罪分子的然后隐藏 暴露给用户一个没有name属性的标签
<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">
</form>
csrf解决策略
'''针对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表单还是需要额外指定
这篇关于cookie session 中间件的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!