• Django框架(十一)--cookie和session


    cookie和session组件

    cookie

    1.cookie的由来

    大家都知道HTTP协议是无状态的。

    无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。

    一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。

    状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。

    2.什么是cookie

    存储在客户端浏览器上的键值对。

    随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!

    3.cookie的工作原理

    cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

    4.cookie的覆盖

    如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。

    5.在浏览器中查看cookie   F12打开开发者工具

     6.cookie的操作

    1.基本语法

    #如何操作cookie
    django返回给客户端浏览器的都必须是HttpResponse对象
    obj = HttpResponse()
    obj.set_cookie('key','value')   #设置cookie就是在HttpResponse对象上
    return obj #也相当于返回HttpResponse()
    #获取cookie,从request对象中取 request.COOKIE.get('k') #删除cookie,HttpResponse对象上 obj.delete_cookie('k')

    设置超时时间 (时间以秒为单位) max_age
    =None, 超时时间 expires=None, 超时时间(用于IE浏览器)

    2.登录认证

    from functools import wraps
    def login_auth(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
    target_url = request.get_full_path()
    if request.COOKIES.get('name'): #验证是否已经存在cookie值
    res = func(request,*args,**kwargs)
    return res
    else:
    return redirect('/lg/?next=%s'%target_url)
    return inner
    @login_auth 
    def order(request):
      return HttpResponse('我是订单页面,我得登录才能看')

    7.cookie加盐

    def salt_cookie(request):
        object = HttpResponse('ok')
        # 加盐,123是个密码,解cookie的时候需要它,
        object.set_signed_cookie('name','lqz',salt='123')# max_age,三天失效
        object.set_cookie('name','lqz',max_age=60*60*24*3)
        # path,只有访问shopping的时候,才会携带cookie过来
        object.set_cookie('name', 'lqz', path='/shopping/')
        object.set_cookie('name', 'lqz')
        return object

    加盐其他属性

    domain    设置域名下有效domain='map.baidu.com'
    expires     超时时间,传一个datatime对象
    secure=False       (默认是false,设置成True浏览器将通过HTTPS来回传cookie)
    httponly=True   只能https协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

    cookie总结:

    设置cookie两种方法:
    rep = HttpResponse(...)
    rep = render(request, ...)
    #第一种
    rep.set_cookie(key,value,...)
    #第二种
    rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)
    
    
    获取cookie两种方法:
    #第一种
    request.COOKIES.get('key')
    #第二种
    request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
    
    
    删除cookie方法:
    rep.delete_cookie('key')

    session

    1.什么是session

    Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。

    问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。

    我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。

    总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。

    另外,上述所说的Cookie和Session其实是共通性的东西,不限于语言和框架。

    session就是保存在服务器上的键值对,session虽然是保存在服务器上的键值对,但是它是依赖于cookie工作的
    服务端返回给浏览器一个随机的字符串,浏览器以键值对的形式保存cookieid:随机字符串
    浏览器在访问服务端的时候,就会将随机字符串携带上:
    后端获取随机字符串与后端的记录做对比
    随机字符串1:数据1
    随机字符串2:数据2

    2.session的使用

    #设置session
    request.session['name'] = 'jason'
    #设置的session键值对以字典的形式存储到django_session表中的session_data中
    
    #设置session时:
        1.django内部自动生成一个随机字符串
        2.将随机字符串和你要保存的数据写入django_session表中(先在内存中生成一个缓存记录,等到经过中间件的时候才会执行)
        3.将产生的随机字符串发送到浏览器写入cookie
            sessionid:随机字符串
    
    #取值
    request.session.get('name')
    #取值时:
        1.django内部会自动从请求信息中获取到随机字符串
        2.拿着随机字符串去django_session表中对比
        3.一旦对比上了就将对应的数据拿出来放在request.session中
    
    #删除浏览器的sessionid信息,为了减轻数据库的查询负担,过一段时间会自动把服务器的session删除
    request.session.delete()
    
    #将浏览器和服务端全部删除(推荐使用这个
    request.session.flush()
    这用于确保前面的会话数据不可以再次被用户的浏览器访问

    设置,获取,删除

    #设置session
    def set_session(request):
        request.session['xxx'] = 'xxx'
        request.session.set_expiry(30)  #设置30秒过期
        return HttpResponse('set_session')
    
    #获取session
    def get_session(request):
        request.session.get('xxx')
        return HttpResponse('get_session')
    
    #删除session
    def delete_session(request):
        request.session.flush()
        return HttpResponse('delete_session')

    3.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,默认修改之后才保存(默认)

    设置超时时间

    request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。
  • 相关阅读:
    开放源码的对象关系映射工具ORM.NET 插入数据 Insert/Update Data
    开放源码的对象关系映射工具ORM.NET 快档开发入门 Quick Start
    .NET 动态脚本语言Script.NET 开发指南
    开放源码的对象关系映射工具ORM.NET 删除数据 Deleting Records using ORM.NET
    .NET Remoting过时了吗?为什么公司的项目还是选择用.NET Remoting,而不是WCF?
    开放源码的对象关系映射工具ORM.NET 查看和显示数据 View and Display data using ORM.NET
    开放源码的对象关系映射工具ORM.NET 查询表 调用存储过程 增加自定义代码
    技术人生:坚持,每日一博
    CQRS:CQRS + DDD + MDP 实现快速应用程序开发
    NodeJs:Happy代码生成器,重构了代码,更新了文档,完善了示例,欢迎下载使用
  • 原文地址:https://www.cnblogs.com/wangcuican/p/11581673.html
Copyright © 2020-2023  润新知