cookie,session,django中间件,csrf回顾

时间:2019-10-31
本文章向大家介绍cookie,session,django中间件,csrf回顾,主要包括cookie,session,django中间件,csrf回顾使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

cookie与session

cookie与session的概念

​ 1.起源
​ 由于http协议是无状态的无法保存用户状态 所以需要发明一些能够保存用户状态的技术
​ 2.cookie
​ 保存在浏览器上的键值对
​ cookie虽然是保存在客户端浏览器上的,但是是服务端设置的
​ 也就意味着 浏览器有权限禁止服务端写入cookie
​ 3.session
​ 由于cookie是将所有的关键性信息保存在客户端浏览器上的 数据不是很安全
​ 所以有了session:session就是将数据保存在服务端 只给客户端浏览器一个随机字符串
​ 服务端记录了 随机字符串与真实数据的对应关系

django如何操作cookie与session

1 django操作cookie
由于视图函数返回的都是HttpResponse对象 所以可以利用该对象来操作cookie
return HttpResponse()

obj = HttpResponse()
obj.set_cookie(key,value)  # 告诉浏览器在本地保存一个键值对
obj.set_cookie(key,value,max_age=5)  # 还可以设置超时时间
return obj 

        
2.基于cookie做用户的登录认证
    request.COOKIES.get(key)  # 检验用户是否登录

    如何保存用户在没有登录之前想访问的那个页面的url,然后当用户用户名和密码输入正确点击登录之后再跳转会去
    request.path_info  # 只拿后缀
    request.get_full_path()  # 后缀加get请求携带的参数

    利用上面的方法在装饰器中获取用户想要访问的url
    在跳转到登录页面的url的时候 以get请求携带参数的方式将用户想要访问的url携带过去
    在登录的视图函数中 对url进行判断 
        1.用户没有登录的情况下访问了一个必须登录的页面
        2.用户直接访问的就是登录页面

3.操作session
    设置
        request.session['key'] = value
        """
        1.django内部自动随机生成一个随机字符串
        2.在服务端默认情况下需要django_session表来存储session信息(没有执行数据库迁移命令会报错)
            django session默认的过期时间是14天
        3.将随机字符串发送给客户端浏览器 让浏览器写入cookie
            sessionid : 随机字符串
        """
    获取
        request.session.get('key')
        """
        1.会自动去客户端浏览器发送过来的数据中查找cookie信息
        2.拿着该信息去django_session表中比对
        3.无论有没有数据 你都可以通过request.session.get()
            1.没有返回的结果就是None
            2.有则返回随机字符串所对应的真实数据               
        """
    设置超时时间
        request.session.set_expiry(value)
            value 
                数字
                0
                时间格式
                不写
    
    删除session  
        request.session.flush()
        
        request.session.delete()
    
    额外知识点补充
        session是保存在服务端上的键值对
            1.数据库
            2.文件
            3.缓存数据库
            4....
        一句话 后端可以用很多种方式来保存session信息 并不是只能保存在数据库中      

django中间件

django中间件是django的门户 任何的请求来和响应走都需要经过中间件,所以中间件在做一些网站全局性的功能时特别好用
1.校验用户访问频率
2.校验用户黑名单 白名单
3.获取用户权限
在web领域 权限其实就是一个个的url
(CRM项目)
RBAC 基于角色权限管理
权限表

​ 用户表

​ 角色表

用户表和角色表 可以是多对多

角色和权限也是一个 多对多

1 实现给每一个角色绑定响应的权限
2 创建用户的时候只需要指定该用户的角色即可
3 在用户登录的时候 在中间件中获取到该用户所有的权限
4 然后用户每一次访问url的时候 都去校验是都在用户可以访问的url列表中

django默认有七个中间件 并且支持用户自定义自己的中间件

1 django暴露给用户五个可以自定义的方法
    需要掌握的
        process_request
            1.请求来的时候 会按照settings配置文件中从上往下的顺序依次执行每一个中间件里面的该方法 
            2.中间件里面如果没有定义该方法 直接跳过执行下一个
            3.该方法内如果你自己返回了HttpResponse对象 那么不再往后执行  直接跳到同级别的process_response方法
        process_response
            1.响应走的时候 会按照settings配置文件中从下往上的顺序依次执行每一个中间件里面的该方法
            2.该方法必须将形参response返回
            3.如果没有定义该方法 直接跳过执行下一个
    
需要了解的
    process_view
        当路由匹配成功之后执行视图函数之前
    
    process_exception
        当视图函数中出现bug的时候 自动触发
    
    process_template_response
        返回的对象中 必须含有render方法 才会触发

2.如何自定义

1 新建一个专门用来存放中间件的文件夹 里面新建任何名称的py文件
在该文件中 需要写类并继承MiddleMixin
class MyMiddle(MiddleMixin):
    # 自定义上面的五个方法

2 需要在setting配置文件中注册你写的中间件
    需要你自己手动书写字符串的路径  写到类名为止

csrf跨站请求伪造

钓鱼网站
正规网站在返回给用户含有post请求的页面 都附带了一个随机的字符串
然后下一次用户在提交post请求的时候 会先校验该随机字符串是否存在并判断是否一致

form表单
    在form标签内写
        {% csrf_token %}
    
ajax中如何避免
    
    1.通过标签查找的方式
        {'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()}
    2.第二种 
        {'csrfmiddlewaretoken':'{{ csrf_token }}'}
    3.第三种
        # 直接拷贝官网提供的js文件 动态获取
        # 你只需要在你的页面上导入该文件即可
       

相关装饰器
    csrf_exempt
    
    csrf_protect
    
    在给CBV装饰的时候有区别
        1.需要导入一个固定的装饰器 method_decorator(装饰器,方法名)
        
    
        csrf_exempt这个装饰器比较特殊 装饰的时候 只能给dispatch方法装
        
        
        2.其他的装饰器  自定义的 模块的
            1.直接类外面指名道姓的装
            2.给dispatch装
            3.直接装在方法上

原文地址:https://www.cnblogs.com/aden668/p/11772082.html