• Django——cookie session token 及其在django中使用


    一、cookie session token

    1 cookie:客户端浏览器上的键值对
    2 session:存在服务端的键值对
    3 token: 服务端签发的加密字符串   (加密的键值对,如果放在客户端浏览器上,它就叫cookie)
    比如:
    head.{name:lqz,age:18}.eseetsweasdca
    base64加码后变成:
    asdfasfd.asdfasdf.asdfasdfaeraew
    
    后端校验:
    用这个token去查我的账户余额,向银行发请求,银行校验通过,是银行给你的,---》返回你的余额
    比如:head.{name:lili,age:18}.eseetsweasdca 服务端可以匹配上,允许访问
        eseetsweasdca的生成跟{name:lili,age:18}对应的
    但是head.{name:egon,age:18}.eseetsweasdca  name变了后服务端就匹配不成功了

    二、django中cookie的使用

    1.知识储备

    # 0 会话跟踪,会话保持
    # 1 cookie规范
        -记住:当前网站在浏览器上cookie个数和大小有限制
        -在服务端朝响应头里写cookie,到浏览器后会读出来,把k=v k=v存到浏览器里,下次浏览器再发送请求,浏览器会把放在浏览器里的cookie自动包装到http请求中去,
       之后到了django框架,解析http把cookie放到字典里,jdango矿机会把所有的k v转到request.COOKIE字典里,在字典里就可以取出来了
    -Cookie大小上限为4KB; -一个服务器最多在客户端浏览器上保存20个Cookie; -一个浏览器最多保存300个Cookie; # 2 django中操作cookie -增:obj.set_cookie('key','value') -删: obj.delete_cookie('key') # 实质是设置过期 -查: request.COOKIES.get('key') -改: obj.set_cookie('key','value1') # 3 带签名的cookie(加盐,加密) -增:obj.set_signed_cookie('name','lili','123') -删: obj.delete_cookie('name') # 实质是设置过期 -查: request.get_signed_cookie('name',salt='123') -改: obj.set_signed_cookie('name','guo','1234')

    2.普通版

    urls.py略

    views.py

    from django.shortcuts import HttpResponse
    
    def cookie_test(request):
        # 浏览器向我这个地址发一个请求,就在浏览器写入 name = zhangsan
        obj=HttpResponse('ok')
        obj.set_cookie('name','zhangsan')  # 写入到浏览器了,在http响应头里:cookie: name=zhangsan
        obj.set_cookie('age','19')  # 写入到浏览器了,在http响应头里:cookie: age=19
        return obj
    
    def get_cookie(request):
        print(request.COOKIES)
        print(request.COOKIES.get('name'))
        return HttpResponse('我拿了你传过来的cookie')
    
    def delete_cookie(request):
        obj=HttpResponse('我删掉了你 name 这个cookie ')
        obj.delete_cookie('name')
        return obj

     3.加盐加密版

    urls.py略

    views.py

    def set_cookie(request):
        obj = render(request, 'index.html')
        obj.set_signed_cookie('name', 'lili', 'aaaa') #增  改 
        obj.delete_cookie('name')#
        return obj
    
    def get_cookie(request):
        print(request.COOKIES.get('name')) #
        print(request.get_signed_cookie('name',salt='123'))#
        return HttpResponse('获取成功')

    三、django中session的使用

     1.知识储备

    1 session是存在于服务端的键值对
    
    2 同一个浏览器不允许登录多个账户,不同浏览器可以登录同一个账户
    
    3 session的使用(必须迁移数据)
        -增:request.session['name']=lqz
        -查:request.session['name']#查,没有会报错
        -改:request.session['name']=egon
        -删:del request.session['name']
        -设置过期时间:request.session.set_expiry(10) #防爬虫
        
    4 session的其它使用
        -request.session.setdefault('k1',123)#有不改,没有新增
        -request.session.get('name',None)#查,没有不会报错
        -del request.session['k1'] #
        
        -request.session.keys()
        -request.session.values()
        -request.session.items()
        -request.session.session_key # 获取那个随机字符串,django_session表中session_key字段
        
        -request.session.clear_expired() # 清除过期的session
        -request.session.exists("session_key") # 判断这个随机字符串(session_key字段),有没有数据
        -request.session.delete() # 删除所有的值,django_session表中删除当前登录者的这条记录
        -request.session.flush()  # 干了request.session.delete()这个事后,把cookie设置为过期

    2.代码views.py

    Django中使用session时,做的事:

    # 生成随机字符串
    # 写浏览器cookie -> session_id: 随机字符串
    # 写到服务端session:
        # {
        #     "随机字符串": {'user':'alex'}
        # }
    # 设置session
    # django框架默认,把session信息存到数据库中了,django_session表
    # 先迁移数据库
    def session_set(request):
        # request.session是个字典
        # 写了下面那一句话,干了如下几件事
        '''
            # 一个浏览器,一个随机字符串
            1 生成一个随机字符串asdfasdf,把随机字符串和name=lqz数据加密存到django_session表中(加密用的就是配置里SECRET_KEY里生成的随机密钥)
            2 会把这个随机字符串放到cookie中
                obj.set_cookie('sessionid',asdfasdf)
        '''
        request.session['name'] = 'lqz'
        request.session['age'] = 19
    
        return HttpResponse('session写入了')
    
    
    def session_set2(request):
        request.session['name'] = 'egon'
        request.session['xx'] = 'xx'
    
        return HttpResponse('session写入了')
    
    
    def session_get(request):
        # name=request.session.get('name') #用get查如果没有不会报错,[]取会报错
        # print(name)
        # print(request.session.keys())
        # print(request.session.values())
        # print(request.session.items())
    
        print(request.session.session_key)
    
        return HttpResponse('获取到了session')

    四、django中session的配置

    def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
                       domain=None, secure=False, httponly=False)
    
    # key
    # value
    # max_age:传个数字,以秒计,过期时间,有默认值 (5天后过期:60*60*24*5)
    ---了解
    # expires:传时间对象,date=datetime.timedelta()
    # path:默认 / 表示当前域下的所有路径  http://127.0.0.1:8000/lqz/dfd/
    # domain:设置在哪个域下有效
    # secure:是否Https传输cookie
    # httponly:cookie只支持http传输
    
    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'        # 引擎

    # 缓存中用pickle存是二进制的形式,用json是明文,不安全,但也可以把它转成二进制形式或加密

    5. 加密Cookie Session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 其他公用设置项: SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)***记住,可以写成60*60*24*14别人容易看清 ---了解 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) 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_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

    代码关于path:

    from django.shortcuts import render, HttpResponse, redirect
    
    def set_cookie(request):
        print(request.session)
        obj = render(request, 'index.html')
        # obj.set_signed_cookie('name', 'lqz', '123',path='/lqz/')
        obj.set_cookie('name', 'lqz', path='/lqz/') #只有在朝跟路径后面加 着/lqz/发请求才会携带 cookie
        return obj
  • 相关阅读:
    关于javascript app框架的几篇文章
    php 开发笔记
    php 图片处理扩展(windows平台)
    [javascript]最短 domready
    javascript小陷阱
    HTML DOM whiteSpace
    40岁后才明白的道理:人一生奋斗余地很有限转载
    [学习笔记]lca倍增
    Django model 字段类型及选项解析转载
    PythonPEP8 风格规范指南
  • 原文地址:https://www.cnblogs.com/guojieying/p/13850659.html
Copyright © 2020-2023  润新知