Django--Cookie与Session
Cookie
Cookie 定义
Cookie,有时也用其复数形式 Cookies. 指的是由服务端生成, 保存在客户端的一种数据存储形式, 内部以 key-value 键值对形式存储. value大小有限制(最大为4kb). 数据不安全. Cookie 是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将 Cookie 的 key/value 保存到某个目录下的文本文件内,下次请求同一网站时就发送该 Cookie 给服务器(前提是浏览器设置为启用 cookie )。
Cookie 名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等。
服务器可以利用 Cookies 包含信息的任意性来筛选并经常性维护这些信息,以判断在 HTTP 传输中的状态。
Cookies 最典型记住用户名。建议:Cookie 是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用
Cookie 的特点
-
Cookie 以键值对 Key-Value 形式进行信息的存储
-
Cookie 基于域名安全,不同域名的 Cookie 是不能互相访问的
例如:
保存在 www.baidu.com 域名下面的 cookie 不能够被其他域名的访问
设置 Cookie
可以通过 HttpResponse 对象中的 set_cookie 方法来设置 cookie。
# 使用方法: # 创建 response 对象 response = HttpResponse() # 调用对象的 set_cookie() 函数 response.set_cookie(key, value, max_age)
参数解析: key: cookie 中保存信息的名称 value: cookie 中保存信息时, 名称对应的值部分 max_age: cookie 中保存信息的有效期, 超过有效期, key-value 失效 其中 max_age 单位为秒, 默认为 None. 如果设置 None 值, 则关闭浏览器失效.
例如:
response.set_cookie('tracydzf', 'python', max_age=3600)
读取 Cookie
可以通过 HttpRequest 对象( request )的 COOKIES 属性来读取本次请求携带的 cookie 值。
# 使用方法: # 其中: request.COOKIES 为字典类型 value = request.COOKIES.get('key')
request.COOKIES 为字典类型, 可以使用字典的 get( )
例如:
value = request.COOKIES.get('itcast') # python
Session
Session 了解
Session 是一种会话控制方式. 由服务端创建, 并且保存在服务端的数据存储形式. 内部以 key/value 键值对的形式存储. 可以存储敏感信息, 内容有些会被加密. 一般生成 session 后, 我们会把 sessionid 传递给 cookie 保存.
Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。
当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户信息。
Session 的作用
- 在服务器上保存用户状态信息, 以供前端页面访问
- 因为数据保存在服务器端, 所以可以保存敏感信息. 每次前端发送请求, 可以随时获取对应的信息. 保持会话状态
Session 的特点
- 依赖 cookies
- 存储敏感、重要的信息
- 支持更多字节
- Session 共享问题
启用 Session
Django 项目默认启用 Session
可以在 settings.py 文件中查看,如图所示
如需禁用 session,将上图中的 session 中间件注释掉即可。
Redis
在 redis 中保存 session,需要引入第三方扩展,我们可以使用 django-redis 来解决。
1) 安装扩展
pip install django-redis
2)配置
在 settings.py 文件中做如下设置
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://192.168.195.129:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } } SESSION_ENGINE = "django.contrib.sessions.backends.cache" SESSION_CACHE_ALIAS = "default"
注意
如果 redis 的 ip 地址不是本地回环 127.0.0.1, 而是其他地址,访问 Django 时,可能出现 Redis 连接错误,如下:
解决方法:
修改 redis 的配置文件,添加特定 ip 地址。
打开 redis 的配置文件
sudo vim /etc/redis/redis.conf
在如下配置项进行修改(如要添加 192.168.195.129:6379 地址)
重新启动 redis 服务
sudo service redis-server restart
测试
打开view.py文件
def index(request): #创建redis Session request.session['name'] = "tracydzf" #获取Session value = request.session.get('name') print(value) return HttpResponse("OK")
打开urls.py
urlpatterns = [ re_path(r'^index/$', views.index), ]
通过redis-cli客户端查看