ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## **一、Session介绍** 1. `session`与`cookie`对比 1. `cookie`是在浏览器端保存键值对数据,而`session`是在服务器端保存键值对数据 2. 重要敏感的数据(银行卡账号,验证码,余额等),建议存储在服务器端,不能通过cookie保存到浏览器 3. `session`的使用依赖`cookie` 2. Django中`session`数据的保存 * 不同的用户使用各自不同的浏览器,可以认为:一个浏览器代表一个用户 * 【重要】表中一条记录,保存着一个浏览器(用户)所有的session键值对数据 * 【重要】`sessionid`是什么: 浏览器标识(用户标识),代表着一个用户,**通过`sessionid`可以找到该用户所有的session键值对数据** ## **二、Session使用** 1. 开启session功能【默认已经开启】 django封装了`session`模块,用来简化`session`数据操作。请参见`settings.py`配置文件中session配置: ~~~ INSTALLED_APPS = [ ... # 默认导入了django自带的session模块 'django.contrib.sessions', ] MIDDLEWARE = [ ... # 开启session中间件 'django.contrib.sessions.middleware.SessionMiddleware', ] ~~~ 2. **生成django项目默认的数据库表** 1. `session`数据默认保存在django项目的一张数据库表中(表名为:`django_session`) 2. **在保存session数据库前,需要先生成django项目默认的数据库表** 3. 如何生成: 打开终端,并进入到项目根目录下,再执行以下2个命令生成数据库表: ~~~ python manage.py makemigrations python manage.py migrate ~~~ 3. 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保存 登录用户名 和 验证码: * 访问`http://127.0.0.1:8000/set_session`界面时,保存session数据 * 访问`http://127.0.0.1:8000/get_session`界面时,读取session数据 * 实现参考 ~~~ # url配置 url(r'^set_session$', views.set_session), url(r'^get_session$', views.get_session), # 视图函数 def set_session(request): """保存session键值对数据""" request.session['user_id'] = 10 request.session['user_name'] = 'admin' return HttpResponse('保存session成功') def get_session(request): """读取session键值对数据""" user_id = request.session.get('user_id') user_name = request.session.get('user_name') text = 'user_id = %s, user_name = %s' % (user_id, user_name) return HttpResponse(text) ~~~ ## 四、保存session到redis中 使用第三方包`django-redis`实现\*\* 1. 在虚拟环境下安装包 ~~~ pip install django-redis==4.8.0 ~~~ 2. 修改`settings.py`文件,新增如下选项: ~~~ # 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数据缓存到Redis中 SESSION_ENGINE = "django.contrib.sessions.backends.cache" SESSION_CACHE_ALIAS = "default" ~~~ 3. 测试:**启动Redis服务器**,登录一次,再查看session是否有保存到 redis 1号数据库中