http是无状态的,这是什么意思呢?就是说,在没有cookie之前,你第一次访问这个页面和第二次访问这个页面,服务器是不知道的,不知道前一次是你。那么问题来了,我怎么登录,登录成功后,刷新下,服务器就不认识我了,不展示我的信息了,这怎么能行,于是cookie就产生了,cookie是存在客户端的,最常见的就是浏览器了,你第一次访问页面的时候,服务器会返回个cookie给你,这个cookie其实就是sessionId,并存于客户端,第二次的时候,你刷新页面的时候,浏览器就会带上之前的cookie,cookie就像通行证,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了,这就是Cookie的工作原理。
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
Cookie和Session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用(注意:有些资料说ASP解决这个问题,当浏览器的cookie被禁掉,服务端的session任然可以正常使用,ASP我没试验过,但是对于网络上很多用php和jsp编写的网站,我发现禁掉cookie,网站的session都无法正常的访问)。
在views.py页面创建
def createcookie(request):
'''def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
domain=None, secure=False, httponly=False, samesite=None):'''
response = HttpResponse('ok')
# max_age是秒为单位,同时设置expires,max_age会覆盖expires
response.set_cookie(key='new', value='a new cookie', max_age=60*60)
return response
获取COOKIE:
# 这个得到的数据类型为字典结构
print(request.COOKIES)
print(request.COOKIES.get('new', '默认值'))
删除COOKIE:
response_obj = HttpResponse('删除cookie')
response_obj.delete_cookie('cookie')
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions', # 这个是安装的应用
'django.contrib.messages',
'django.contrib.staticfiles',
]
也叫作缓存数据库,要使用redis需要安装扩展:
在自己对应的工作环境安装扩展,权限不够则sudo开头
workon django_py3
pip install django_redis
然后在settings.py进行配置:
可以参考官方文档:https://docs.djangoproject.com/en/2.2/ref/settings/
# 这是redis作为session的保存数据库的设置
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/0', # 这个0代表redis要选的值
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
"CONNECTION_POOL_KWARGS": {"max_connections": 100},
}
}
}
# 这是存储到哪里
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
# django1.8或者1.6配置方式
# pip install django_redis_session
# SESSION_ENGINE = 'redis_sessions.session'
# SESSION_REDIS_HOST = 'localhost'
# SESSION_REDIS_PORT = 6379
# SESSION_REDIS_DB = 0 # 0-15选一个数据库
# SESSION_REDIS_PASSWORD = '' # 密码
Django中的Session有3种存储方式:放在数据库、缓存或者文件系统中,下面分别予以介绍。
如果要将Session存储在数据库中,我们需要将 ’django.contrib.sessions’ 加入到INSTALLED_APPS 变量中。然后运行 manage.py syncdb 在数据库中创建相应的存储Session的数据库表。
如果想获得更好的性能,我们可以将Session保存在缓存中。这里有两种配置方式:一种是设置SESSION_ENGINE 为”django.contrib.sessions.backends.cache” 。这是一种简单配置,Session将之被保存在缓存中,但是不保证Session总是能取到(比如缓存溢出时Session会丢失);另一种方式是设置SESSION_ENGINE 为 “django.contrib.sessions.backends.cached_db”。这种方式下,Session在保存到缓存的同时还会被保存到数据库中,当Django在缓存中找不到Session时,会从数据库中找到。第二种方式会有一点点性能开销,但是安全性和冗余性更好。
还有一种方式是将Session存储在文件系统中。需要设置SESSION_ENGINE 为”django.contrib.sessions.backends.file”,这时你还需要同时设置SESSION_FILE_PATH 变量,它代表Session文件保存的位置,缺省的设置一般是tempfile.gettempdir(),表示系统的临时目录。这里要确保应用程序对那个目录有读写的权限。
4.这个是混合存取:
django.contrib.sessions.backends.cached_db