zoukankan      html  css  js  c++  java
  • 第4天:Django的cookie和session

    • Cookie
    • Session

    Cookie

    浏览器请求服务器是无状态的,它的每一次请求对于服务器来说都是新的,服务器默认不会保存用户的状态数据。但很多时候,服务器需要保存用户的一些状态数据,比如用户是否登录过,用户浏览过哪些商品等。解决方案,有以下两种:

    1. cookie
    2. session

    cookie及特点

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

    Django中Cookie的保存和读取

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

    response.set_cookie('', '',max_age)
    
    # max_age 有效期,一个整数,单位为秒,表示在多长时间后失效
    # Cookie默认有效期: 如果不指定有效期,或者max_age值为None,则关闭浏览器后Cookie数据就会过期

    读取cookie: 通过HttpRequest请求对象的COOKIES属性(字典类型)读取

    request.COOKIES['']
    # 或者:
    request.COOKIES.get('')

    案例

    需求:

      访问 http://127.0.0.1:8000/set_cookie 界面时,保存cookie数据

      访问 http://127.0.0.1:8000/get_cookie 界面时,读取cookie数据

    实现参考:

    urlpatterns = [
        ...
        url(r'^set_cookie$', users.views.set_cookie),
        url(r'^get_cookie$', users.views.get_cookie),
    ]
    url配置
    ...
    def set_cookie(request):
        """保存cookie键值对数据"""
        response = HttpResponse('保存cookie数据成功')
        response.set_cookie('user_id', 10)
        response.set_cookie('user_name', 'heboan')
        return response
    
    
    def get_cookie(request):
        """读取cookie键值对数据"""
        user_id = request.COOKIES.get('user_id')
        user_name = request.COOKIES.get('user_name')
        text = 'user_id = {}, user_name = {}'.format(user_id, user_name)
        return HttpResponse(text)
    视图函数配置

    Seesion

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

    session键值对数据保存

    session数据默认保存在django项目的一张数据库表中(表名为:django_session),保存格式如下

    • 不同的用户使用各自不同的浏览器,可以认为:一个浏览器代表一个用户
    • 【重要】表中一条记录,保存着一个浏览器(用户)所有的session键值对数据
    • 【重要】sessionid 是什么: 浏览器标识(用户标识),代表着一个用户,通过sessionid 可以找到该用户所有的session键值对数据

    session的使用

    Django已经默认开启了session功能,django封装了session模块,用来简化session数据操作。请参见settings.py 配置文件中session配置

    INSTALLED_APPS = [
         ...
         # 默认导入了django自带的session模块
         'django.contrib.sessions',
     ]
    
     MIDDLEWARE = [
         ...
         # 开启session中间件
         'django.contrib.sessions.middleware.SessionMiddleware',
     ]
    settings.py

    生成django项目默认的数据库表

    1. session数据默认保存在django项目的一张数据库表中(表名为:django_session)
    2. 在保存session数据库前,需要先生成django项目默认的数据库表
    3. 如何生成: 打开终端,并进入到项目根目录下,再执行以下2个命令生成数据库表
    python manage.py makemigrations
    python manage.py migrate

    session数据操作

    # request.session属性:类型为 django.contrib.sessions.backends.db.SessionStore
    
    # 保存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周后过期
    session操作

    本地缓存

    存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快

    SESSION_ENGINE='django.contrib.sessions.backends.cache'

    混合存储

    优先从本机内存中存取,如果没有则从数据库中存取

    SESSION_ENGINE='django.contrib.session.backends.cached_db'

    Redis

    在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决

    安装扩展

    pip install django-redis

    在settings.py文件中做如下配置

    # django-redis
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379/1",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        }
    }
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    SESSION_CACHE_ALIAS = "default"

    在一个视图中写入session测试

    访问http://127.0.0.1:8000/users/index

    查看Redis

  • 相关阅读:
    HttpMediaTypeNotSupportedException: Content type 'text/plain;charset=UTF-8' not supported
    【MySQL用法】Mysql数据库连接池 [ druid ] 的所有配置介绍
    冒泡排序
    com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 20, maxActive 20
    判断两个线段是否相交02
    判断两个线段是否相交
    unity小地图制作___按比例尺图标布局
    Unity---Inspector面板自定义
    unity物理检测的几种方式
    unity音量设置(同时设置到多个物体上)——引伸语言设置
  • 原文地址:https://www.cnblogs.com/sellsa/p/10339332.html
Copyright © 2011-2022 走看看