zoukankan      html  css  js  c++  java
  • cookie session token 中间件

    cookie 与session原理

    为什么会有这些技术?
      1.目的是为了保存客户端的用户状态
      2.原因:HTTP协议是无状态的

      cookie
        保存在客户端浏览器上的键值对
        cookie虽然是保存在客户端浏览器上的键值对
        但是它是有服务端设置的
        浏览器有权禁止cookie的写入

    django如何操作cookie
      小白必会三板斧
        obj = HttpResponse()
        # 利用obj对象你才可以操作cookie
        return obj

        obj = render()
        return obj

        obj = redirect()
        return obj

    cookie基本操作

      如何设置cookie
        obj.set_cookie('k1','v1') # 告诉浏览器设置
      如何获取cookie
        request.COOKIES.get('k1') # 获取浏览器携带过来的cookie值
      如何设置cookie的超时时间
        obj.set_cookie('k1','v1',max_age=3)
        obj.set_cookie('k1','v1',expires=3)
        # 两个参数都是设置超时时间 并且都是以秒为单位
        # 区别:如果你要给IE浏览器设置cookie的超时时间 你只能用expires
      如何删除cookie(注销 退出登录)

    def login(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            if username == 'jason' and password == '123':
                obj = redirect('/home')
                obj.set_cookie('whoami', 'jason')
                return obj
        return render(request, 'login.html')
    
    
    def home(request):
        if request.COOKIES.get('whoami'):
            return render(request, 'home.html')
        return redirect('/login/')

    基于cookie实现登录认证

    登录装饰器

    from functools import wraps
    def login_auth(func):
        @wraps(func)
        def inner(request,*args,**kwargs):
            # 判断当前用户是否登录
            # print('request.path_info:',request.path_info)  # 只获取url
            # print('request.get_full_path():',request.get_full_path())  # url+get参数
            if request.COOKIES.get('whoami'):
                res = func(request,*args,**kwargs)
                return res
            else:
                target_path = request.path_info
                return redirect('/login/?next=%s'%target_path) #登录前想访问的页面携带
        return inner
    def login(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            if username == 'jason' and password == '123':
                # 登录成功
                old_path = request.GET.get('next')
                if old_path:  # 防止用户直接访问的login页面
                    obj = redirect(old_path)
                else:
                    obj = redirect('/home/')  # 默认跳转到首页 当用户没有想要访问的网址
                obj.set_cookie('whoami','jason')  # 告诉浏览器保存一个键值对
                return obj
        return render(request,'login.html')

    注销功能

    def logout(request):
        obj = redirect('/login/') # 注销后默认跳到登录页面
        obj.delete_cookie('whoami')
        return obj

    session基本操作

    session
      保存在服务端上面的键值对
      session的工作机制是需要依赖于cookie的


      设置session
        request.session['k1'] = 'v1'
        # 第一次设置的时候会报错 是因为你没有执行数据库迁移命令 生成django需要用到的一些默认表(django_session)

      """
      django默认的session失效时间是14天 2周
      """
      request.session['k1'] = 'v1'
      """
      上面这一句话到底发生了哪些事儿
        1.djang内部自动帮你调用算法生成一个随机的字符串
        2.在django_session添加数据(数据也是加密处理)
          随机字符串    加密之后的数据    失效时间
             ashdjsad      jsadsada
        3.将产生的随机字符串返回给客户端浏览器 让浏览器保存
          sessionid:随机字符串

      """

    获取session
      request.session.get('k1')
      """
        1.django内部会自动去请求头里面获取cookie
        2.拿着sessionid所对应的随机字符串去django_sessoion表中一一比对
        3.如果比对上了 会将随机字符串对应的数据获取出来 自动放入request.session中供程序员调用
        如果没有就是一个空字典
      """


    删除session
      request.session.delete()
      客户端和服务端全部删除 只会根据浏览器的不同删对应的数据

      request.session.flush() # 建议使用这个 只删客户端的session数据



    如何设置失效时间
      # 设置会话Session和Cookie的超时时间
      request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。


    django session在创建数据的时候 是针对浏览器的

    能够作为数据库的有哪些
      数据库软件
      关系型
      非关系型
      文件
      内存

     token  

    https://www.cnblogs.com/moyand/p/9047978.html

     

     

     django中间件

    django默认有七个中间件
      只要你想要做一些网站的全局性功能 你都应该考虑使用django的中间件
        1.全局的用户登录校验
        2.全局的用户访问频率校验
        3.全局的用户权限校验() 20行代码 100+ RBAC
      django的中间件是所有框架里面做的最完善的



    对象    字符串    》》》      反射
    全局          》》》    中间件

    并且支持用户自定义中间件 然后暴露给用户五个可以自定义的方法
      需要掌握
      process_request(******)
        1.请求来的时候会按照settings配置文件中从上往下的顺序 依次执行每一个中间件内部定义的process_request方法
    如果中间件内部没有该方法 直接跳过执行下一个中间件
        2.该方法一旦返回了HttpResponse对象,那么请求会立刻停止往后走 原路立即返回

      process_response
        1.响应走的时候会按照settings配置文件中从下往上的顺序 依次执行每一个中间件内部定义的process_response方法
        2.该方法必须有两个形参 并且必须返回response形参 不返回直接报错
        3.该方法返回什么(HttpResponsed对象) 前端就能获得什么

    # 当process_request方法直接返回HttpResponse对象之后 会直接从当前中间件里面的process_respone往回走
    # 没有执行的中间件都不会再执行


    需要了解
      process_view(self,request,view_name,*args,**kwargs)
        1.路由匹配成功之后执行视图函数之前触发
        2.如果该方法返回了HttpResponse对象 那么会从下往上一次经过每一个中间件里面的process_response方法
      process_template_response
        1.当你返回的对象中含有render属性指向的是一个render方法的时候才会触发 从下往上的顺序
        def mdzz(request):
          print('我是视图函数mdzz')
          def render():
            return HttpResponse('你好呀 我是奇葩')
          obj = HttpResponse('我很好 好的像个傻逼一样')
          obj.render = render
          return obj
      process_exception
      1.当视图函数中出现错误 会自动触发 顺序是从下往上
    上面这五个方法 会在特定的阶段自动触发

    # 如果形参中含有response 那么必须要返回

  • 相关阅读:
    CSS Transform让百分比宽高布局元素水平垂直居中
    Apache配置详解
    MAMP环境配置
    ajax 设置Access-Control-Allow-Origin实现跨域访问
    Git常用命令
    ThinkPHP3.2.3批量执行sql语句(带事务)
    MySQL 百万级分页优化(Mysql千万级快速分页)
    zabbix server端与agent端源码安装 自定义监控项
    Tomcat多实例集群架构 安全优化和性能优化
    Tomcat安装应用部署及配置文件解读
  • 原文地址:https://www.cnblogs.com/fjn839199790/p/11984261.html
Copyright © 2011-2022 走看看