浏览器请求服务器是无状态的,它的每一次请求对于服务器来讲都是新的,服务器默认不会保存用户的状态数据。但不少时候,服务器须要保存用户的一些状态数据,好比用户是否登陆过,用户浏览过哪些商品等。解决方案,有如下两种:python
cookie及特色redis
Django中Cookie的保存和读取数据库
保存cookie: 经过HttpResponse响应对象的set_cookie方法保存django
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数据cookie
访问 http://127.0.0.1:8000/get_cookie 界面时,读取cookie数据session
实现参考:ide
urlpatterns = [ ... url(r'^set_cookie$', users.views.set_cookie), url(r'^get_cookie$', users.views.get_cookie), ]
... 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)
cookie是在浏览器端保存键值对数据,而session是在服务器端保存键值对数据,重要敏感的数据(银行卡帐号,密码等),建议存储在服务器端,不能经过cookie保存到浏览器。session的使用依赖cookie.
session键值对数据保存
session数据默认保存在django项目的一张数据库表中(表名为:django_session),保存格式以下
session的使用
Django已经默认开启了session功能,django封装了session
模块,用来简化session
数据操做。请参见settings.py
配置文件中session配置
INSTALLED_APPS = [ ... # 默认导入了django自带的session模块 'django.contrib.sessions', ] MIDDLEWARE = [ ... # 开启session中间件 'django.contrib.sessions.middleware.SessionMiddleware', ]
生成django项目默认的数据库表
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_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