zoukankan      html  css  js  c++  java
  • Django简单设置cookies和session

    一、Cookie

    cookie及特点

    • Cookie是由服务器(网站)生成的,存储在浏览器端的 键值对数据(通常经过加密)
    • 在响应请求时,服务器会把生成 Cookie数据 发给浏览器,浏览器会自动保存(前提:浏览器开启了cookie功能)
    • 浏览器请求服务器(网站)时,会自动上传该服务器(网站)生成的所有Cookie
    • Cookie基于 域名安全 的。每个网站只能访问到自己生成的cookie,无法访问其它网站(域)生成的cookie

    2.Cookie的应用

    • 保存登录状态:当用户登录某网站后,一定时间内不用再次输入用户名和密码登录。
    • 保存用户浏览器的商品: 再次访问网站时,把用户之前浏览过的商品记录显示出来

    3.django中cookies的读取与保存

    1. 保存cookie: 通过HttpResponse响应对象的set_cookie方法保存

       response.set_cookie('键', '值',max_age)
      • max_age 有效期,一个整数,单位为秒,表示在多长时间后失效
      • Cookie默认有效期: 如果不指定有效期,或者max_age值为None,则关闭浏览器后Cookie数据就会过期
    2. 读取cookie: 通过HttpRequest请求对象的COOKIES属性(字典类型)读取

       request.COOKIES['键']  # 一般不用这个,因为没有会报错
       # 或者:
       request.COOKIES.get('键')  # 一般用这个,没有时为空
    3. 补充:cookie中文乱码问题解决

      # 保存:中文 -> bytes -> base64字符串
      data = base64.b64encode('中文'.encode())
      
      # 读取: base64字符串 -> bytes -> 中文
      user_name = base64.b64decode(data).decode()

    二、Session

    1.sessioncookie对比

    • cookie是在浏览器端保存键值对数据,而session是在服务器端保存键值对数据
    • 重要敏感的数据(银行卡账号,验证码,余额等),建议存储在服务器端,不能通过cookie保存到浏览器
    • session 的使用依赖cookie

    2.Django中session数据的保存

    session数据默认保存在django项目的sqlite数据库的django_session这个表中,保存格式如下:

    但是这个sqlite是轻量级数据库,性能不太好。生产环境下我们一般是把session保存在redis数据库中的。

    3.关于django中的redis设置

    (1)安装依赖包

    pip3 install django-redis==4.8.0  # 4.8.0适合django1.11.1使用

    (2)setting文件的设置:

    MIDDLEWARE = [

    ...

    # 开启session中间件,为了请求前能获取sessionid的值

    'django.contrib.sessions.middleware.SessionMiddleware',

    ]

    INSTALLED_APPS = [

    ...

    # 默认导入django自带的session模块

    'django.contrib.sessions',

    ]

    # django项目的缓存配置

    CACHES = {
         "default": {
             "BACKEND": "django_redis.cache.RedisCache",
             "LOCATION": "redis://127.0.0.1:6379/1",
             "OPTIONS": {
                 "CLIENT_CLASS": "django_redis.client.DefaultClient",
                     "PASSWORD": ""
             }
         }
     }

    # 默认值,表示存到数据库
    # SESSION_ENGINE ='django.contrib.sessions.backends.db'
    # session数据缓存到Redis中
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    SESSION_CACHE_ALIAS = "default"

    4.django中的session使用

    • 保存session数据(键值对

      request.session['键'] = 值
      
    • 读取session数据

      request.session.get('键', 默认值)
      
    • 删除命令

      # 删除一个sessoin键值对(注意:键不存在会报错 `KeyError`)
      del request.session['键']
      
      # 清除当前访问用户所有的session数据
      request.session.flush()  # 删除一条表记录
      request.session.clear()  # 清空字段中的session键值对数据
      
    • 设置session数据有效时间; 如果不设置,默认过期时间为两周

      request.session.set_expiry(value)
      
      • 如果value是一个整数,则 session数据 将在value秒没有活动后过期
      • 如果value为0,则 session数据 将在用户 关闭浏览器时过期
      • 如果value为None,则 session数据 将在 2周后过期
  • 相关阅读:
    走进__proto__属性,看ie是否支持它,谁又来给他归宿
    如何安装zip格式的MySQL
    博客初心源于前端攻城狮
    Day 1: How to install jedi/codeintel plugin for sublime on Linux
    关于拓扑排序的一些想法
    POJ1061 青蛙的约会 __一维世界的爱情
    缩步查找法——一种新的查找算法
    HDU3371 Connect the Cities
    HDU1598 find the most comfortable road
    codeforces 349 div2.c
  • 原文地址:https://www.cnblogs.com/chichung/p/9882453.html
Copyright © 2011-2022 走看看