zoukankan      html  css  js  c++  java
  • day78

    昨日回顾:
       forms组件:
          -校验数据(最重要)
             -先定义一个类(继承Form)
             -写一些要校验的字段(好多类型)
             -字段(对象)有一些属性(最长多少,最短多少,是否必填,lable,错误信息)
             -实例化产生form对象(传字典,也可以不传)
             -form对象.is_valid()  为true的时候,才是数据校验通过
             -form对象.errors  当成一个字典(继承了字典),它是所有的错误信息{name:[列表,]}
             -每个字段.errors 列表
          -渲染模板(模板)
             -第一种:{{ myform.name }}   myform.name拿到的是每个字段对象,只是用它来生成input框(这种用的很多)
             -第二种:for循环,(用的也很多)
             -第三种:myform.as_p()
          -渲染错误信息:
             -form对象的错误信息
             -字段的错误信息
          -局部钩子(能走到它,说明前面校验已经通过了,一定能把该字段值取出来)
             def clean_字段名字(self):
              指定字段取出来=self.cleanded_data.get(字段)
              做判断,一旦失败:抛异常(ValidationError)
              成功:返回这个字段的值
        
          -全局钩子(能走到它,前面的全都执行过了,包括局部钩子),在做密码判断的时候,一定要注意,可能密码取出来为空
             def clean(self):
              pwd取出来
              re_pwd取出来
              做判断一旦失败:抛异常(ValidationError)
              成功:返回cleanded_data

     今日内容:
        -cookie
           -是什么?存储在客户端浏览器上的键值对
        -原理
           是服务器产生,发给客户端浏览器,浏览器保存起来,下次发请求,会携带这个键值对到服务器
          -Cookie的覆盖
             先写了一个键值对,后来再写,会把原来的值覆盖掉
        -cookie使用(**********************)

    # 设置cookie
    def login(request):
        if request.method == 'GET':
            return render(request, 'login.html')
        if request.method == 'POST':
            name = request.POST.get('name')
            pwd = request.POST.get('pwd')
            if name == 'yxf' and pwd == '123':
                obj = HttpResponse('登陆成功')
                obj.set_signed_cookie('login', 'qqq', salt='123', max_age=15)
                # obj.set_cookie('login', True)
                return obj
            return HttpResponse('登陆失败')
    View Code

      -获取cookie

    def get_cookie(request):
        try:
            res = request.COOKIES['login']
            print(res)
        except Exception as e:
            return HttpResponse('NO')
        return HttpResponse('YES')
    View Code

      -删除cookie

    # 删除cookie
    def del_cookie(request):
        obj = HttpResponse('success')
        obj.delete_cookie('login')
        return obj
    View Code
        request.COOKIES['key']
        request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
    参数:
        default: 默认值
        salt: 加密盐
        max_age: 后台控制过期时间
    
    设置Cookie
        rep = HttpResponse(...)
        rep = render(request, ...)
    
        rep.set_cookie(key,value)
        rep.set_signed_cookie(key,value,salt='加密盐')
    
    参数:
        key, 键
        value='', 值
        max_age=None, 超时时间 cookie需要延续的时间(以秒为单位)如果参数是 None`` ,这个cookie会延续到浏览器关闭为止
        expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
        path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问,浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点中的其他的应用。
        domain=None, Cookie生效的域名 你可用这个参数来构造一个跨站cookie。如,                 domain=".example.com"所构造的cookie对下面这些站点都是可读的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果该参数设置为 None ,cookie只能由设置它的站点读取
        secure=False, 浏览器将通过HTTPS来回传cookie
        httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)  
    

      -session
           -解决cookie不安全的问题,
           -存在服务器上的键值对{'sdaf随机字符串':{name:lqz,pwd:123}}
           -用session必须跟cookie连用
           -session使用(****************)

      -生成session

    def set_session(request):
        if request.method == 'GET':
            # 设置session值
            request.session['name'] = 'xxx'
            return HttpResponse('set_session')
    View Code

      -设置值
            -request.session['name']='xxx'
            -如果设置多个,它会以字典的形式存储到session表中的session_data中
        -生成session时:
            1 生成随机字符串:dfasfasdfa
            2 取数据库存储
            3 写入cookie(set_cookie('sessionid','dfasfasdfa'))

      -取值

    def get_session(request):
        # 取出session的值
        # 先从前台收到cookie中的随机字符串,然后到数据库中匹配,然后返回查找到的data
        name = request.session['name']
        print(name)
        # 取到随机字符串,浏览器带过来的cookie的值
        print(request.session.session_key)
        # 清除数据空中的超时的session
        request.session.clear_expired()
        # 校验session_id是否存在
        flag = request.session.exists("session_key")
        print(flag)
        return HttpResponse('get_session')
    View Code

      -执行流程:
            -取到cookie的随机字符串
            -取session表中根据随机字符串查询,查询出session_data这个字典,然后把字典中name返回

      -删除

    def del_session(request):
        # 删除数据库中的session
        # request.session.delete()
        # 删除数据库以及浏览器中的session
        request.session.flush()
        return HttpResponse('del_session')
    View Code

      -# 取出cookie,随机字符串,去数据库删除随机字符串是当前值的记录
             request.session.delete()
         -#既删除cookie,又删除数据库
             request.session.flush()

    session补充

    # 获取、设置、删除Session中数据
    request.session['k1']
    request.session.get('k1',None)
    request.session['k1'] = 123
    request.session.setdefault('k1',123) # 存在则不设置
    del request.session['k1']
    
    
    session相关方法
    # 所有 键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()
    request.session.iterkeys()
    request.session.itervalues()
    request.session.iteritems()
    
    # 会话session的key
    request.session.session_key
    
    # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()
    
    # 检查会话session的key在数据库中是否存在
    request.session.exists("session_key")
    
    # 删除当前会话的所有Session数据(只删数据库)
    request.session.delete()
      
    # 删除当前的会话数据并删除会话的Cookie(数据库和cookie都删)。
    request.session.flush() 
        这用于确保前面的会话数据不可以再次被用户的浏览器访问
        例如,django.contrib.auth.logout() 函数中就会调用它。
    
    # 设置会话Session和Cookie的超时时间
    request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。
    

    session配置

    1. 数据库Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
    
    2. 缓存Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    
    3. 文件Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 
    
    4. 缓存+数据库
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    5. 加密Cookie Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
    
    其他公用设置项:
    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)
    

      

  • 相关阅读:
    LeetCode 227. Basic Calculator II
    LeetCode 224. Basic Calculator
    LeetCode 103. Binary Tree Zigzag Level Order Traversal
    LeetCode 102. Binary Tree Level Order Traversal
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode 169. Majority Element
    LeetCode 145. Binary Tree Postorder Traversal
    LeetCode 94. Binary Tree Inorder Traversal
    LeetCode 144. Binary Tree Preorder Traversal
  • 原文地址:https://www.cnblogs.com/yaoxiaofeng/p/10004034.html
Copyright © 2011-2022 走看看