理解Cookie和Session机制,Django进行配置cookie和session、redis

理解Cookie和Session机制,Django进行配置cookie和session、redis

  • 什么是cookie
  • 什么是session
  • cookie和session的区别
  • django简单的创建一个cookie
  • django1.11上的session
    • 1.如果需要使用数据库存储session,需要安装应用,django默认已经安装好了:
    • django1.11上session配置redis数据库
    • 在终端redis查看session内容
    • session存储四种方式

什么是cookie

http是无状态的,这是什么意思呢?就是说,在没有cookie之前,你第一次访问这个页面和第二次访问这个页面,服务器是不知道的,不知道前一次是你。那么问题来了,我怎么登录,登录成功后,刷新下,服务器就不认识我了,不展示我的信息了,这怎么能行,于是cookie就产生了,cookie是存在客户端的,最常见的就是浏览器了,你第一次访问页面的时候,服务器会返回个cookie给你,这个cookie其实就是sessionId,并存于客户端,第二次的时候,你刷新页面的时候,浏览器就会带上之前的cookie,cookie就像通行证,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了,这就是Cookie的工作原理。

什么是session

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

cookie和session的区别

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上;
  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
  4. 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;

Cookie和Session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用(注意:有些资料说ASP解决这个问题,当浏览器的cookie被禁掉,服务端的session任然可以正常使用,ASP我没试验过,但是对于网络上很多用php和jsp编写的网站,我发现禁掉cookie,网站的session都无法正常的访问)。
理解Cookie和Session机制,Django进行配置cookie和session、redis_第1张图片

django简单的创建一个cookie

在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')

django1.11上的session

1.如果需要使用数据库存储session,需要安装应用,django默认已经安装好了:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',  # 这个是安装的应用
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

可以查看django_session表的结构:
理解Cookie和Session机制,Django进行配置cookie和session、redis_第2张图片
理解Cookie和Session机制,Django进行配置cookie和session、redis_第3张图片

django1.11上session配置redis数据库

也叫作缓存数据库,要使用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 = ''  # 密码

在终端redis查看session内容

理解Cookie和Session机制,Django进行配置cookie和session、redis_第4张图片

session存储四种方式

Django中的Session有3种存储方式:放在数据库、缓存或者文件系统中,下面分别予以介绍。

  1. 将Session存储在数据库中:

如果要将Session存储在数据库中,我们需要将 ’django.contrib.sessions’ 加入到INSTALLED_APPS 变量中。然后运行 manage.py syncdb 在数据库中创建相应的存储Session的数据库表。

  1. 将Session存储在缓存中:

如果想获得更好的性能,我们可以将Session保存在缓存中。这里有两种配置方式:一种是设置SESSION_ENGINE 为”django.contrib.sessions.backends.cache” 。这是一种简单配置,Session将之被保存在缓存中,但是不保证Session总是能取到(比如缓存溢出时Session会丢失);另一种方式是设置SESSION_ENGINE 为 “django.contrib.sessions.backends.cached_db”。这种方式下,Session在保存到缓存的同时还会被保存到数据库中,当Django在缓存中找不到Session时,会从数据库中找到。第二种方式会有一点点性能开销,但是安全性和冗余性更好。

  1. 将Session存储在文件系统中:

还有一种方式是将Session存储在文件系统中。需要设置SESSION_ENGINE 为”django.contrib.sessions.backends.file”,这时你还需要同时设置SESSION_FILE_PATH 变量,它代表Session文件保存的位置,缺省的设置一般是tempfile.gettempdir(),表示系统的临时目录。这里要确保应用程序对那个目录有读写的权限。

4.这个是混合存取:
django.contrib.sessions.backends.cached_db

你可能感兴趣的:(Django)