• django框架中的cookie与session


    cookie
    因为http是一个无状态协议,无法记录用户上一步的操作,所以需要状态保持。
    cookie和session的区别:
    1.cookie是保存在浏览器本地的,所以相对不安全。cookie是4k的大小,最多保存20条(因为最原始的浏览器的本地是很小的,只是一个历史数据,但是其实是不精确的),默认的过期时间是14天。
    2.session是保存在服务器的,是相对安全的,session依赖于cookie,sessionid保存在cookie中,理论上无大小限制。
    3.相同点:都是实现状改保持,都是有服务器产生的,都有过期时间,都可以自己定义过期时间。

    1.设置cookie
    在响应里面设置cookie
    HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)

    2.读取cookie

    可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。

     session
    session的理解需要从两个方面去理解
    广义上:session机制 —会话,用于记录多次http请求之间的关系,关系就是状态数据
    狭义上:session数据— 保存session机制状态的数据。
    1.启用session
    Django中是默认启用session的,在setting中中间件已经设置好的,如果禁用,就删掉或注释。

     2.存储方式
    2.1数据库存储
    flask把默认情况下的session放在cookie中,也就是浏览器中
    SESSION_ENGINE=‘django.contrib.sessions.backends.db’
    默认存储在数据库中的存储方式
    如果存储在数据库中还需要在INSTALLED-APPS配置中安装session的app

    在数据库表中就可以看到一个django_session表

    2.2本地缓存
    存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。
    SESSION_ENGINE=‘django.contrib.sessions.backends.cache’
    保存本地的问题:
    在多机情况下存在跨机访问的问题

    多个服务器保存一份代码的原因:
    为了保证并发量
    QPS:每秒的请求次数
    防止宕机:不是代码可以解决的问题,用到redis里面的哨兵机制。

    2.3混合存储
    优先从本机内存中存取,如果没有则从数据库中存取。
    SESSION_ENGINE=‘django.contrib.sessions.backends.cached_db’

    2.4redis
    1.安装扩展
    pip install django-redis
    引入的这个扩展可以直接当做是session的后端来使用
    2.配置
    在setting.py中配置如下内容
    本质就是在本地缓存的基础上增加了一个后端的配置,

     通过HttpRequest对象的session属性进行会话的读写操作。
    1)以键值对的格式写session。
    request.session[‘键’]=值
    2)根据键读取值。
    request.session.get(‘键’,默认值)
    3)清除所有session,在存储中删除值部分。
    request.session.clear()
    4)清除session数据,在存储中删除session的整条数据。
    request.session.flush()
    5)删除session中的指定键及值,在存储中只删除某个键及对应的值。
    del request.session[‘键’]
    6)设置session的有效期
    request.session.set_expiry(value)
    • 如果value是一个整数,session将在value秒没有活动后过期。
    • 如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
    • 如果value为None,那么session有效期将采用系统默认值,默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。(以秒为单位)

  • 相关阅读:
    Ubuntu下安装了java但启动eclipse报错说没装java
    Servlet之Filter详解
    使用mybatis-generator自动生成model、dao、mapping文件
    深入浅出MyBatis
    彻底理解字符编码
    Java多线程系列
    【Swagger2】解决swagger文档地址请求404的问题
    【Git】Git如何合并某一次commit的内容到指定分支
    【Iterm2】如何解决iterm2窗口自动隐藏的问题
    【Git】.DS_Store 是什么文件
  • 原文地址:https://www.cnblogs.com/shengguorui/p/11571796.html
Copyright © 2020-2023  润新知