• cookie与session以及中间件(CSRF)


    session和cookie

    cookie与session
            为什么会有cookie和session?
                由于http协议是无状态的 无法记住用户是谁
            cookie
                cookie是保存在客户端浏览器上的键值对
                
                是服务端设置在客户端浏览器上的键值对
                也就意味着浏览器其实可以拒绝服务端的"命令"
                默认情况下 浏览器都是直接让服务端设置键值对
            
            django必会三板斧
                return HttpResponse()
                return render()
                return redirect()
                
                变形:
                obj1 = HttpResponse()
                return obj1
                obj2 = render()
                return obj2
                obj3 = redirect()
                return obj3
                
                
                设置cookie
                    obj1.set_cookie()
                获取
                    request.COOKIES.get()
                删除
                    obj1.delete_cookie()
                
                1.登录功能
                    用户登录成功之后 一定要保存用户状态
                    
                
            
            
            session
                session是保存在服务器上的键值对
                
                django session默认的过期时间是14天
                
                
                操作session
                
                设置session
                    request.session['key'] = value  # 仅仅只会在内存产生一个缓存
                    """
                    1.django内部自动生成了随机的字符串
                    2.在django_session表中存入数据
                        session_key          session_data         date
                        随机字符串1              数据1            ...
                        随机字符串2              数据2            ...
                        随机字符串3              数据3            ...
                    3.将产生的随机字符串发送给浏览器 让浏览器保存到cookie中
                        sessionid:随机字符串
    
                    """  
                获取session
                    request.session.get('key')
                    """
                    1.浏览器发送cookie到django后端之后 django会自动获取到cookie值
                    2.拿着随机字符串去django_session表中比对 是否有对应的数据
                    3.如果比对上了 就讲随机字符串所对应的数据 取出赋值给request.session
                       如果对不上 那么request.session就是个空
                       
                    """
                    
                    
                django session表是针对浏览器的
                不同的浏览器来 才会有不同的记录
                
                
                
                删除session
                    request.session.delete()  # 只删除服务端的session
                    
                    request.session.flush()  # 浏览器和服务端全部删除
    
                
                session也可以设置超时时间
                    request.session.set_expiry(value多种配置)
                        
                        数字     秒
                        0 
                        不写     14天
                        时间格式
    

    django中间件

    用户访问频率限制
            用户是否是黑名单 白名单
            所有用户登录校验
            只要是涉及到网址全局的功能 你就应该考虑使用中间件
            
            
            django中间件暴露给程序员五个可以自定义的方法(五个方法都是在特定的条件下自动触发的)
                1.新建一个文件夹 里面新建一个任意名称的py文件
                里面写类 固定继承
                from django.utils.deprecation import MiddlewareMixin
                class MyMiddle(MiddlewareMixin):
                    ...
                2.去配置文件注册到中间件配置中
                    你需要手写字符串的路径
                     'app01.mymiddleware.myaabb.MyMiddle1'
            
    
                需要掌握的
                    process_request(******):请求来的时候 会从上往下依次经过每一个中间件里面process_request,一旦里面返回了HttpResponse对象那么就不再往后执行了 会执行同一级别的process_response
                            def process_request(self,request):
                                print('我是第一个自定义中间件里面的process_request方法')
                                return HttpResponse("我是第一个自定义中间件里面的HttpResponse对象返回值")  # 直接原地返回
                    process_response(***):响应走的时候 会从下往上依次进过每一个中间件里面的process_response
                            def process_response(self,request,response):  # response就是要返回给用户的数据
                                print("我是第一个自定义中间件里面的process_response方法")
                                return response
                了解的
                    process_view:路由匹配成功之后执行视图函数之前触发
                    process_exception:当视图函数出现异常(bug)的时候自动触发
                    process_template_response:当视图函数执行完毕之后并且返回的对象中含有render方法的情况下才会触发
     form表单
                你在写的时候只需要加上一个
                {% csrf_token %}
            
            
            ajax
                第一种  自己再页面上先通过{% csrf_token %}获取到随机字符串  然后利用标签查找 
                data:{'username':'jason','csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()},
                第二种
                data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},
                第三种
                拷贝js文件
                
                
                
        装饰器
            csrf_exempt  只有两种装饰的方式
            from django.views.decorators.csrf import csrf_exempt, csrf_protect
            from django.utils.decorators import method_decorator
            # 第一种
            # @method_decorator(csrf_exempt,name='dispatch')
            class MyCsrf(View):
                # 第二种
                @method_decorator(csrf_exempt)
                def dispatch(self, request, *args, **kwargs):
                    return super().dispatch(request,*args,**kwargs)
                def get(self,request):
                    return HttpResponse('hahaha')
                    
            除了csrf_exempt之外 所有的其他装饰器 在CBV上面都有三种方式
            @method_decorator(csrf_protect,name='post')
            class MyCsrf(View):
                @method_decorator(csrf_protect)
                def dispatch(self, request, *args, **kwargs):
                    return super().dispatch(request,*args,**kwargs)
                def get(self,request):
                    return HttpResponse('hahaha')
    
                @method_decorator(csrf_protect)
                def post(self,request):
                    return HttpResponse('post')
    

    跨站请求伪造(csrf) 钓鱼网站

     就类似于你搭建了一个跟银行一模一样的web页面
            用户在你的网站转账的时候输入用户名 密码 对方账户
            银行里面的钱确实少了 但是发现收款人变了
            
            
            最简单的原理
                你写的form表单中 用户的用户名  密码都会真实的提交给银行后台
                但是收款人的账户却不是用户填的 你暴露给用户的是一个没有name属性的input框
                你自己提前写好了一个隐藏的带有name和value的input框
                
                
        解决钓鱼网站的策略
            只要是用户想要提交post请求的页面 我在返回给用户的时候就提前设置好一个随机字符串
            当用户提交post请求的时候  我会自动先取查找是否有该随机字符串 
            如果有 正常提交
            如果没有  直接报403 
    
  • 相关阅读:
    上周热点回顾(11.2912.5)
    上周热点回顾(11.1511.21)
    上周热点回顾(11.2211.28)
    上周热点回顾(12.1312.19)
    Bambook程序达人赛报名公告
    HTML5技术专题上线啦!
    “博客无双,以文会友”活动公告
    上周热点回顾(12.612.12)
    [转]Java RMI之HelloWorld篇
    中国现代远程与继续教育网 统考 大学英语(B)考试大纲
  • 原文地址:https://www.cnblogs.com/oxtime/p/11767437.html
Copyright © 2020-2023  润新知