第4天:Django的cookie和session
- Cookie
- Session
Cookie
浏览器请求服务器是无状态的,它的每一次请求对于服务器来说都是新的,服务器默认不会保存用户的状态数据。但很多时候,服务器需要保存用户的一些状态数据,比如用户是否登录过,用户浏览过哪些商品等。解决方案,有以下两种:
- cookie
- 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项目默认的数据库表
- session数据默认保存在django项目的一张数据库表中(表名为:django_session)
- 在保存session数据库前,需要先生成django项目默认的数据库表
- 如何生成: 打开终端,并进入到项目根目录下,再执行以下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

第4天:Django的cookie和session的更多相关文章
- Django之Cookie、Session、CSRF、Admin
Django之Cookie.Session.CSRF.Admin Cookie 1.获取Cookie: 1 2 3 4 5 6 request.COOKIES['key'] request.get ...
- [py][mx]django的cookie和session操作-7天免登录
浏览器同源策略(same-origin policy) csrf攻击防御核心点总结 django的cookie和session操作-7天免登录 flask操作cookie&django的see ...
- Django基础cookie和session
Django基础cookie和session 1.会话跟踪 什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如给10086打个电话,你就是客户端, ...
- django的cookie和session以及内置信号、缓存
cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览 ...
- django的cookie 和session
Cookie 1.获取cookie: request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt=' ...
- Django组件-cookie与session
一.会话跟踪技术 1.什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而 ...
- web框架开发-Django组件cookie与session
http协议的每一次都是无保存状态的请求,这会带来很多的不方便,比如,一刷新网页,或者进入该网页的其他页面,无法保存之前的登录状态.为了解决类似这样的问题,引入了会话跟踪 会话跟踪技术 1 什么是会话 ...
- Django 之 cookie和session
一. Cookie 1.Cookie的由来 因为HTTP协议是无状态的,无状态的意思就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,也不会受前后请求响应情况直接影响.简 ...
- django之COOKIE 与 SESSION
COOKIE 与 SESSION 概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie ...
- 9.Django组件-cookie和session
HTTP协议的无保存状态,对两次请求没有任何关联.每次请求都是相互独立的. 1.cookie简介 什么是会话跟踪技术我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会 ...
随机推荐
- 【BZOJ】2434: [Noi2011]阿狸的打字机 AC自动机+树状数组+DFS序
[题意]阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小写 ...
- spring boot获取前端参数四种方法
一:直接参数绑定 @RequestMapping("/hello") @ResponseBody public String hello(String para) { // par ...
- 微信小程序开发教程(七)逻辑层——.js详解
逻辑层,是事务逻辑处理的地方.对于小程序而言,逻辑层就是.js脚本文件的集合.逻辑层将数据进行处理后发送给视图层,同时接收视图层的事件反馈. 微信小程序开发框架的逻辑层是由JavaScript编写.在 ...
- 基本控件文档-UIView属性
CHENYILONG Blog 基本控件文档-UIView属性 Fullscreen UIView属性技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http ...
- Mother's Mil 母亲的牛奶
Description 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装 ...
- D. Sum in the tree(树形+贪心)
题目链接;http://codeforces.com/contest/1099/problem/D 题目大意:给出一棵树,每个节点到根节点的路径上经过的所有点的权值之和,其深度为偶数的节点的信息全部擦 ...
- Go语言的各种Print函数
Go语言的各种Print函数 func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) func Pr ...
- VM虚拟机和主机互传文件,使用xshell连接Ubuntu
安装虚拟机后,有时需要在window和Ubuntu互传文件,安装VMwave tooles比较麻烦,干脆直接用xshell连接Ubuntu即可 1,已经安装Ubuntu和xshell 2,在Ubunt ...
- 教你用DrawLayout 实现Android 侧滑菜单
现在的APP越来越注重用户体验,百度视频客户端有一个特效还是挺吸引人的,在主界面手指向右滑动,就可以将菜单展示出来,而主界面会被隐藏大部分,但是仍有左侧的一小部分同菜单一起展示.类似的还有天天动听,人 ...
- Flask:初次使用Flask-SQLAlchemy读取SQLite3
Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2,Eclipse Oxygen.1a Release (4.7.1a),PyDev 6.3.2 SQLAlchemy是一 ...